【问题标题】:On Duplicate insert new row with new keyOn Duplicate insert new row with new key
【发布时间】:2015-07-23 06:28:58
【问题描述】:

以相同格式从一个表格插入到另一个表格,或将 csv 文件导入现有表格。如果检测到重复的主键,而不是更新现有行,我希望将重复项添加为具有新键的新行。这可能与 ON DUPLICATE 吗?

【问题讨论】:

  • 您使用的是哪个 DBMS?
  • 我正在使用 mysql 工作台和 mysql 5.6

标签: mysql sql


【解决方案1】:

这可以用 ON DUPLICATE 吗?

不,命令是 ON DUPLICATE KEY UPDATE,没有 ON DUPLICATE KEY INSERT。

你有选择。

  1. 您可以使用存储过程来完全实现这一点。 As described on this answer
  2. 如果您只需要填充表格并且您不关心 在导入时在另一个表格中引用的 id(似乎是因为您将为某些他们)在自己插入 id 的情况下进行导入。您应该将您的 id 作为自动增量,并且数据库将为每条记录分配新的,此时无需检查重复的 id。
  3. 如果出于某种原因,您需要保留除重复项之外的所有 ID 的原始 ID。我强烈建议拆分你的excel:一个没有任何重复,一个只有重复。这样就可以很容易地导入带有原始 ID 的第一个,并在没有它们的情况下导入第二个(因此系统会为每个 ID 生成一个)。

【讨论】:

  • 谢谢。我正在尝试使用工作台从 csv 文件导入数据。我收到密钥错误。如果我在导入之前将键值输入到 csv 文件中,它可以正常工作。如果我将 Key 列留空,则会收到错误消息。如果我没有在 csv 中包含 Key 列,我也会收到错误消息。我希望能够导入 csv 而不必先输入键值。你能解释一下我可能做错了什么吗?我得到的错误是:1366:不正确的整数值:“对于第 1 行的列‘键’
  • 不客气。错误的数据类型或违反约束。我所做的是将 excel 文件导入新表,因此在第一步中我完全没有问题(该表复制了 excel 工作表)。然后我运行一个简单的查询,在目标表中插入该临时表的每一行。目标表的 id 为 int 和 autoincrement,因为我没有给它任何 id,它为每一行生成一个。它是一个单行查询。
猜你喜欢
  • 2023-02-06
  • 2010-10-07
  • 2019-02-12
  • 2013-10-03
  • 2022-08-02
  • 2011-01-29
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多