加载数据infile - 上传CSV文件

时间:2018-02-05 15:27:06

标签: mysql bash sh import-csv

抱歉我的英语..

我编写了一个shell脚本来通过csv-file更新本地mysql数据库中的表。

#! /bin/sh
mysql --user=root --password=12345 \
-e "USE database one;" \
-e "CREATE TABLE IF NOT EXISTS xxxx LIKE xxx;" \
-e "TRUNCATE TABLE xxxx;" \
-e "LOAD DATA INFILE \"/var/lib/mysql-files/data.csv\" INTO TABLE xxxx FIELDS TERMINATED BY ';' ;" \

CSV文件:

1;Müller;Max
2;Wayne;Roney

我的数据库中的字段" id"是整数和主键。 如果我改变csv这个字段,如

a;Müller;Max 
2;Wayne;Roney

脚本在表中的csv中加载数据。 我想有一个错误,因为csv不正确。

我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分:1)

像' a'如果您尝试将其插入整数列,将自动转换为数值。 ' a'的数值是0,因为它没有前导数字。

在这种情况下,我找到了一种强制错误的方法。

首先,您不得将AUTO_INCREMENT用于您的ID列。这将允许0,因为它会导致生成新的id。

其次,在加载数据之前,必须为主键预先插入值为0的行。然后,如果像'a'这样的值被转换为0,那么它将导致UNIQUE KEY违规。

mysql --user=root --password=12345 \
-e "USE database one;" \
-e "CREATE TABLE IF NOT EXISTS xxxx LIKE xxx;" \
-e "TRUNCATE TABLE xxxx;" \
-e "INSERT INTO xxxx (id) VALUES (0);" \
-e "LOAD DATA INFILE \"/var/lib/mysql-files/data.csv\" INTO TABLE xxxx FIELDS TERMINATED BY ';' ;" \
-e "DELETE FROM xxxx WHERE id = 0;"

请注意,如果您使用LOAD DATA LOCAL INFILE...

,这不起作用

https://dev.mysql.com/doc/refman/5.7/en/load-data.html

  

如果没有LOCAL,则在找到重复键值时会发生错误,并忽略文本文件的其余部分。使用LOCAL时,默认行为与指定IGNORE时的行为相同;这是因为服务器无法在操作过程中停止传输文件。

如果条件不适合您,那么您必须在脚本中编写一些额外的代码来检查csv文件,并修复错误数据,否则会输出错误并退出