【发布时间】:2011-04-01 19:11:27
【问题描述】:
我在一个 MySQL 表中有一个唯一键的数据。我现在想导入存储在 CSV 中的最新数据。如果密钥已经存在,我希望它覆盖旧数据,或者如果密钥不存在,则创建一个新行。有谁知道如何在 MySQL 中做到这一点?
感谢您的帮助!
杰夫
【问题讨论】:
我在一个 MySQL 表中有一个唯一键的数据。我现在想导入存储在 CSV 中的最新数据。如果密钥已经存在,我希望它覆盖旧数据,或者如果密钥不存在,则创建一个新行。有谁知道如何在 MySQL 中做到这一点?
感谢您的帮助!
杰夫
【问题讨论】:
使用INSERT ... ON DUPLICATE KEY UPDATE。
INSERT INTO table (column) VALUES ('value') ON DUPLICATE KEY UPDATE column='value'
【讨论】:
【讨论】:
我在这里寻找发起人确切问题的答案,从他最后的评论/问题可以看出他正在寻找更多东西。它激发了以下解决方案。
在脚本或批处理文件中嵌套另一个 shell 环境(例如 MYSQL)会给切换语法带来很多麻烦。我倾向于寻找在一个外壳内运行的解决方案,以减少这些并发症。我找到了这个命令字符串:
mysqlimport --fields-terminated-by=, --ignore-lines=1 --local -uMYSQL_ACCT -pACCT_PWD YOUR_DB_NAME /PATH_TO/YOUR_TABLE_NAME.csv
我从 Jausion 在MySQL 5.0 RefMan :: 4.5.5 mysqlimport w/Jausions Comment 的评论中得到了这个想法。简而言之,您可以通过简单地在表后命名 csv 文件并附加 .csv 扩展名来导入 csv 格式的数据库表。您可以追加到表中,甚至覆盖行。
这是我的一项操作的真实 csv 文件内容。我喜欢制作人类可读的 csv 文件,其中包括第一行中的列标题,因此 --ignore-lines=1 选项。
注意逗号是第一个字符,使第一个字段值为“NULL”。
这是创建第二行的 linux bash 命令:
这里要知道的重要一点是,主键 id 字段的 null 字段允许应用 mysql 自动增量,然后只需将新行添加到您的表中。抱歉,不记得我是在什么地方读到这篇文章还是通过艰难的方式学到的:)
所以,Viola!相反,对这个问题更重要的是,您可以通过提供相关行的主键来覆盖整行数据。
我正在设计一个新表以通过覆盖操作完全满足这些要求,但正如我所提到的,我已经使用了 NULL append-a-row 自动增量选项。
【讨论】: