我的SQL Bulk插入与截断加载数据

时间:2018-09-28 06:35:36

标签: mysql bulkinsert sqlbulkcopy truncation

我正在尝试通过批量插入选项将数据从CSV文件加载到MYSql数据库。这是下面的创建表语法和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';

在以上创建表语法中,我已将列“ title”的数据长度指定为“ 10”。但是第二行数据文件中的值超过了长度10。

当我执行SQL查询时,数据已成功加载到MySQL数据库,这是下面的输出&第二行的“我的值”被截断为“标题”字段。您能否建议如何停止加载而不截断该行。同样,它应该加载下一个连续的行而不终止数据是否合适。请建议

数据库输出:

'475', 'Back', '2014-04-01', 'FFFF'
'476', 'bbbbbbbbbb', '2014-09-01', 'DDD'

2 个答案:

答案 0 :(得分:0)

这是您可以使用的技巧。假设您要保留的最大宽度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确实能够在读取数据时对其进行转换,但是我不确定它是否可以阻止它。

答案 1 :(得分:0)

根据我的理解,以下是您要实现的几点:
1)如果标题长度大于根据表结构指定的字段长度,则数据不应被截断。
2)如果标题长度更大,则在导入记录时应跳过该记录,其余过程应继续进行。

根据mysql数据库进行的考虑:

您可以将sql_mode用作TRADITIONAL(使MySQL的行为类似于“传统” SQL数据库系统。对此模式的简单描述是,在向列中插入错误值时“给出错误而不是警告”。 :https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html

现在设置此模式后,在导入记录时,如果任何不正确的数据或超出范围的值要插入表中,则会发生错误。

下一部分,对于超出范围的值,它们无法跳过错误行。您可以检查现有的讨论链接:Skip error lines while loading data to mysql table from delimited file

对于跳过打破唯一约束或可能创建重复记录的行,可以使用IGNORE关键字与LOAD DATA INFILE一起跳过。

引用:https://dev.mysql.com/doc/refman/5.5/en/load-data.html