【问题标题】:Converting INSERT commands to UPDATE将 INSERT 命令转换为 UPDATE
【发布时间】:2011-04-11 04:46:54
【问题描述】:

我有两个 INSERT 命令,这对我来说毫无用处,因为这两组行 - 已经在表中的行,以及我作为 INSERT 命令的行 - 不是分离的。这两个命令都插入了很多行和很多值。

因此,如果我想执行这些行,我会收到重复输入错误。

有什么简单的方法可以将这些命令“转换”为UPDATE

我知道这听起来很愚蠢,因为如果我想UPDATE,我为什么要发出INSERT 命令。只是为了说明一个清晰的场景:另一个开发人员给了我脚本:)

提前致谢, 丹尼尔

编辑 - 问题已解决

首先我创建了一个表并用我的INSERT 命令填充它,然后我使用了以下REPLACE 命令:

REPLACE
    INTO table_1
SELECT *
    FROM table_2;

最初可以在以下位置找到:How can I merge two MySQL tables?

【问题讨论】:

  • 哪个 SQL?一些变体(例如 MSSQL)支持 MERGE 语句,这肯定会在你的街道上。请更新您的标签。
  • 感谢您的通知。我们正在讨论 MySQL 查询。

标签: mysql insert-update


【解决方案1】:

MySQL 的 REPLACE 关键字可以做到这一点。只需将查询中的INSERT 关键字替换为REPLACE,它就会更新行而不是插入新行。请注意,它仅在您插入主键或唯一键列时才有效。

【讨论】:

  • 谢谢!我将进行编辑以详细解释我的解决方案。
  • 这可能会导致问题。使用 replace 将删除具有重复键的行并写入整个新行。这可能会弄乱您的索引并增加开销。使用 'on duplicate...update' 更合适,这将保留您的索引。替换更适合用于您打算重新索引的一次性场景,而不是重复查询来更新表。
  • 抱歉,不得不投反对票,因为这确实会弄乱您的数据!尤其是当其他表依赖于您的主 ID 时
  • 是的,请谨慎使用并进行适当的测试。但是使用它为我节省了大量手动将 INSERT 语句转换为 UPDATE 语句的时间。
【解决方案2】:

您可以轻松修改查询以更新重复行,请参阅 MySQL 中的 INSERT ... ON DUPLICATE KEY 语法

【讨论】:

  • 我正在考虑使用 ON DUPLICATE KEY 解决方案,但我不明白它有多容易。
【解决方案3】:

对于 MySQL,您可以使用 INSERT IGNOREINSERT ... ON DUPLICATE UPDATE 语法。见MySQL reference manual

【讨论】:

    【解决方案4】:

    您必须手动将它们重写为更新。如果遇到这样的问题,我首先查询某个主键的计数,如果没有找到,我插入一个通用数据集并在之后更新它。这样,可以添加新数据并更新现有数据,您无需区分插入新数据和更新数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 2017-02-14
      • 2021-07-25
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多