mysql批量插入加载带有截断的数据

ru9i0ody  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(375)

我正在尝试通过批量插入选项将数据从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'
i5desfxk

i5desfxk1#

这是你们可以使用的技巧。假设最大宽度 title 如果要保留100个字符,可以按以下方式创建表:

CREATE TABLE discounts (
    id INT NOT NULL,
    title VARCHAR(101) NOT NULL,    -- slightly larger than desired max width
    expired_date DATE NOT NULL,
    amount VARCHAR(255 ) NOT NULL
);

然后加载数据。标题宽度超过100的记录实际上在数据库表中的宽度为101。然后,您可以针对这些记录进行删除:

DELETE
FROM discounts
WHERE LENGTH(title) > 100;

如果需要,现在还可以调整 title 列的宽度正好为100:

ALTER TABLE discounts MODIFY COLUMN title VARCHAR(100);

也许有一种方法可以从 LOAD DATA ,但一般来说,这个工具相当简单,只是设计成盲目地将数据加载到mysql表中。 LOAD DATA 确实有能力在读取时转换数据,但我不确定它是否可以阻止它。

bakd9h0s

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

相关问题