1、load data local命令使用方法
不指定字段名
此写法数据文件内字段数必须跟数据库表一致
load data local infile "C:\\test.txt" into table tableName CHARACTER SET gbk fields terminated by '|' LINES TERMINATED by '\n';
自定义列导入(推荐使用)
在生产环境中推荐使用自定义列导入,这样如果是不需要的字段,就可以不接这个字段内容,这样就不必改表结构。还可以做成数据库配置等进行维护。
//不需要的列直接用@过滤掉就可以了(可以使用同一个变量名比如@a,或者使用我下面不同的变量名加上@符号)
//不需要的列的列名可以随便定义,但是没有加@符的需要跟数据库表字段名一一对应。
// 不需要的列也需要跟数据文件中的字段一一对应,类似于占个坑,但是不进行数据绑定。
load data local infile "C:\\test.txt" into table tableName CHARACTER SET gbk fields terminated by '|' LINES TERMINATED by '\n' (c1,@2,c3,@4, c5,@6,c7,@8,c9,@10);
// set命令可以设置默认值,可以直接赋值, 也可以使用if判断,跟update 差不多。
load data local infile "C:\\test.txt" into table tableName CHARACTER SET gbk fields terminated by '|' LINES TERMINATED by '\n' (c1,c2,c3,c4,c5,c6,c7,c8,c9,c10) set c1 = '1', c9=if(c9='0000-00-00',now(),c9)
数据文件数据样例
1|test|3|tmp|5
6|string|8|a|10
2、命令解析
infile "C:\\test.txt" // 这是你的数据文件存放的位置 最好使用双引号和使用转义符进行路径转义
into table tableName // 这是你数据库的表名
CHARACTER SET gbk // 这是以什么字符编码读取你的数据文件,当你的文件和数据库不对应的时候需要设置(对应的话就不需要)。当你的数据文件是gbk的时候你需要设置成gbk。
fields terminated by '|' // 这个是你的数据文件字段是以什么方式进行分割的。这个是以竖线分割
LINES TERMINATED by '\n' // 这个是你的数据文件一条数据是以什么方式区分的。这里是以换行进行区分的。
(c1,c2,c3,c4,c5,c6,c7,c8,c9,@c10) // 指定列导入,跟数据库表字段对应,不需要的列加@符占个坑位。不需要的列名可随便定义,需要的列名跟数据库字段对应。
set c1 = '1', c9=if(c9='0000-00-00',now(),c9) // 给导入的数据设置值,这里判断的值是导入后的值,比如这个例子是当一个时间类型的数据时在数据文件里是个空的时候导入到表中对应是个0000-00-00 而不是null。所以这里要用0000-00-00,而不是""。
3、注意事项
- 导入的列不会为null 始终会有一个默认值,
- 当数据文件为null的时候如果你的字段类型是int类型,那么导入的值会为0,
- 如果是double类型,那么导入的就会为0.0数据库保留几位小数,则带几位小数
- 如果是varcher类型,则是空字符串
- 最重要的一点,在数据库版本为5.*的版本,会有一个默认时间的bug,当你时间格式为null 的时候,数据库会默认帮你填充0000-00-00 然而这个时间不合法的,假如你需要查到java 中是无法进行绑定的,而且数据库也不认这个时间,假如你要复制这条数据到另外一个表中,是无法插入的。所以在这里建议大家时间设置成varchar类型,或者在load 的时候进行判断把这个时间替换掉。