数据库表字段定义:
CREATE TABLE `TABLE_NAME` (
  `f1`         varchar(25)  default NULL,
  `f2`         varchar(20)  default NULL,
  `f3`         double(15,0) default -1,
  `f4`         varchar(20)  default NULL,
  `f5`         double(15,3) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;源文件:
example_data1.txt数据内容:
abc;cdef;;  [注:这里数据只有4个字段,而表中是有5个字段的]执行如下LOAD DATA命令导入数据:load data infile 'D:\\my_program\\Tek_sig\\example_data1.txt'
into table TABLE_NAME
FIELDS TERMINATED BY ';'系统报错:
Data truncated for column 'f3' at row 1
可能是由于字段定义为double型,而文本文件中是空值,将文本文件更新为:
abc;cdef;2;再次导入,报错如下:
Row 1 doesn't contain data for all columns分析原因可能是由于表中字段一共是5个,而在文本数据源中有了4个字段,少1个字段。
我要问的问题是:
1.LOAD DATA 要求源文件中的字段与数据库表中的字段数量必须完全一样多吗?否则肯定不能导入吗?
2.在数据库里,表的定义中允许有空值的字段,例如`f3`  double(15,0) default -1,而在数据源文件中此字段没有数值,如“abc;cdef;;”,即f3是空的,用两个分号分隔,系统为何报错:Data truncated for column 'f3' at row 1 ,我理解系统应当按空值处理,即在数据库中这个字段default值为“-1”, 但实际上不是这样的,根本无法导入!这一点我觉得MYSQL没有微软的ACCESS的导入功能强大,ACCESS可以允许数据源中缺少最后几个连续的字段,即ACCESS允许被导入的源文件比目标数据库表中的字段数量少,而且在导入数据的过程中ACCESS会用DEFAULT空值来处理那些缺少的字段,即全部用空值或DEFAULT值来填充数据库中表的内容,很方便的。 但MYSQL在导入数据方面,要求的相当严格,字段数量、数据格式要求的相当严格,完全匹配。不知道我的理解是否正确?再有,我要强调的是:我设计的数据分析算法决定了必须要在源数据中多加入一些辅助字段,在后期处理时程序会更新这些辅助字段,所以字段数量不一致的问题是客观存在的,以前我用ACCESS处理数据没有发现这个问题,但ACCESS处理的数据量有限,最大2G,所以我现在想改用MYSQL处理数据,但是遇到了海量数据无法顺利导入的问题。
我不想用代码一条一条的INSERT数据,因为我要处理的数据量太大了,这样会相当慢的!还是想用工具一次导入,如果LOAD DATA 不能支持,那有没有其它相关的工具或手段?多谢各位的指教。

解决方案 »

  1.   

    按上面的回复内容,我试了一下,带列字段还是不能解决此问题:数据库表字段定义:
    CREATE TABLE `TABLE_NAME` (
      `f1`         varchar(25)  default NULL,
      `f2`         varchar(20)  default NULL,
      `f3`         double(15,0) default -1,
      `f4`         varchar(20)  default NULL,
      `f5`         double(15,3) default NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;源文件内容:【文件名:example_data1.txt】
    cat;red;2.0;tree导入命令:load data infile 'D:\\my_program\\Tek_sig\\example_data1.txt'
    into table TABLE_NAME (f1,f2,f3,f4);报错:
    Row 1 doesn't contain data for all columns数据还是导不进去。
      

  2.   

    cat;red;2.0;tree
    你的文件的字段分隔符是;不是默认的逗号,
    你需要注明 
      

  3.   

    我又仔细研究了一下LOAD DATA的说明文档,最终搞明白了,您说的是对的。正确的命令是:
    load data infile 'D:\\my_program\\Tek_sig\\example_data1.txt'
    into table TABLE_NAME 
    FIELDS TERMINATED BY ';'
    LINES TERMINATED BY '\n'
    (f1,f2,f3,f4)结果OK了:
    Query OK, 1 rows affected (210 ms)非常感谢!!我的数据文件各字段之间是用分号分隔的。
    附LOAD DATA语法说明:
    7.16 LOAD DATA INFILE句法
    LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE]
        INTO TABLE tbl_name
        [FIELDS
            [TERMINATED BY '\t']
            [OPTIONALLY] ENCLOSED BY '']
            [ESCAPED BY '\\' ]]
        [LINES TERMINATED BY '\n']
        [IGNORE number LINES]
        [(col_name,...)]
      

  4.   

    字段数不一致导入问题解决了,但是又发现一个新的问题:数据库表字段定义:
    CREATE TABLE `TABLE_NAME` (
      `f1`         varchar(25)  default NULL,
      `f2`         varchar(20)  default NULL,
      `f3`         double(15,0) default -1,
      `f4`         varchar(20)  default NULL,
      `f5`         double(15,3) default NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;源文件内容:【文件名:example_data1.txt】
    cat;red;2.0;tree可以成功导入,没有任何报错:
    load data infile 'D:\\my_program\\Tek_sig\\example_data1.txt'
    into table TABLE_NAME  
    FIELDS TERMINATED BY ';'
    LINES TERMINATED BY '\n'
    (f1,f2,f3,f4)结果OK:
    Query OK, 1 rows affected (210 ms)
    但是将源文件内容改为:cat;red;;tree   【即将‘2.0’数值删除,即f3字段为空了】则系统报错:
    Data truncated for column 'f3' at row 1这是为什么?我在数据库表的字段“f3”的定义中不是可以为空吗(`f3` double(15,0) default -1,)?而且DEFAULT值为-1,难道不起作用吗?我想实现的效果是,如果在源文件中的f3字段没有值,则导入数据后f3字段的内空应为“-1”。谁能帮我分析一下,能否实现我的这一想法?再次感谢!