我编写了一个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不正确。
我该怎么做?
谢谢!
答案 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文件,并修复错误数据,否则会输出错误并退出