我正在尝试通过批量插入选项将数据从csv文件加载到mysql数据库。下面是create table语法和csv文件
CREATE TABLE discounts (
id INT NOT NULL ,
title VARCHAR(10) NOT NULL,
expired_date DATE NOT NULL,
amount VARCHAR(255 ) NOT NULL
);
csv文件格式:
"475","Back","20140401","FFFF"
"476","bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","20140901","DDD"
sql查询:
LOAD DATA INFILE 'C:\Users\karthick\Desktop\data.csv'
INTO TABLE discounts
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';
在上面的create table语法中,我将列“title”的数据长度指定为“10”。但数据文件中第二行的值超过了长度10。
当我执行sql查询时,数据被成功地加载到mysql数据库中,下面是输出&我在第二行的值被截断为字段“title”。您能建议如何停止加载行而不截断它吗。如果数据合适,它也应该加载下一个连续的行而不终止。请建议
数据库输出:
'475', 'Back', '2014-04-01', 'FFFF'
'476', 'bbbbbbbbbb', '2014-09-01', 'DDD'
2条答案
按热度按时间i5desfxk1#
这是你们可以使用的技巧。假设最大宽度
title
如果要保留100个字符,可以按以下方式创建表:然后加载数据。标题宽度超过100的记录实际上在数据库表中的宽度为101。然后,您可以针对这些记录进行删除:
如果需要,现在还可以调整
title
列的宽度正好为100:也许有一种方法可以从
LOAD DATA
,但一般来说,这个工具相当简单,只是设计成盲目地将数据加载到mysql表中。LOAD DATA
确实有能力在读取时转换数据,但我不确定它是否可以阻止它。bakd9h0s2#
根据我的理解,以下是你想要达到的几点:
1) 如果标题长度大于表结构中指定的字段长度,则不应截断数据。
2) 如果标题长度更大,则在导入记录时应跳过该记录,其余过程应继续进行。
按mysql数据库考虑回答:
您可以像传统的那样使用sqlu模式(使mysql表现得像一个“传统的”sql数据库系统)。这种模式的一个简单描述是在向列中插入不正确的值时“给出错误而不是警告”。参考文献:https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html)
现在设置此模式后,在执行记录导入时,如果要将任何不正确的数据或超出范围的值插入到表中,就会发生错误。
下一部分,对于超出范围的值,不能跳过错误行。您可以检查现有的讨论链接:从分隔文件将数据加载到mysql表时跳过错误行
对于跳过违反唯一约束或可能创建重复记录的行,可以使用ignore关键字和load data infle跳过。
参考:https://dev.mysql.com/doc/refman/5.5/en/load-data.html