0

对不起我的英语不好..

我编写了一个 shell 脚本来通过 csv 文件更新本地 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 不正确。

我必须做什么?

谢谢!

4

1 回答 1

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 文件,并修复错误数据,或者打印错误并退出。

于 2018-02-05T16:59:42.243 回答