【问题标题】:Load data infile - Upload a CSV-file在文件中加载数据 - 上传 CSV 文件
【发布时间】:2018-02-05 15:27:05
【问题描述】:

对不起我的英语..

我编写了一个 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 不正确。

我要做什么?

谢谢!

【问题讨论】:

  • 您将“FIELDS”拼错为“FILELS”。
  • 哦,对了。但我有同样的错误。 ://

标签: mysql bash sh import-csv


【解决方案1】:

如果您尝试将类似 'a' 的字符串插入整数列,它会自动转换为数值。 'a' 的数值为 0,因为它没有前导数字。

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

首先,您的 id 列不得使用 AUTO_INCREMENT。这将允许 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 文件,并修复错误数据,或者打印错误并退出。

【讨论】:

    猜你喜欢
    • 2021-05-07
    • 2017-10-14
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2014-02-23
    • 1970-01-01
    相关资源
    最近更新 更多