MySQL:如何使用相同的主键替代行

时间:2019-04-30 17:06:35

标签: mysql

假设我创建了下表:

CREATE TABLE `my_table` (
  num1 INT PRIMARY KEY,
  num2 INT,
  num3 INT
) NGINE=InnoDB DEFAULT CHARSET=utf8;

让我们说我想向表中插入新行,并且如果新行与表中现有行之一具有相同的主键,我希望新行覆盖对应行。

当前,以下SQL查询将完成此工作:

INSERT INTO my_table (num1, num2, num3) VALUES (1, 2, 3)
ON DUPLICATE KEY UPDATE num1 = num1, num2 = num2, num3 = num3;

此查询的问题是麻烦。想象一个有20列的表格。我将不得不再次写所有列名。

您知道实现这一目标的任何优雅方法吗?

2 个答案:

答案 0 :(得分:1)

好吧,您可以跳过主键,因为按定义它与现有行的值相同,否则就不会重复。

请注意,您使用VALUES(columname),否则将不会用VALUES列表中的值覆盖这些值。

INSERT INTO my_table (num1, num2, num3) VALUES (1, 2, 3)
ON DUPLICATE KEY UPDATE num2 = VALUES(num2), num3 = VALUES(num3);

或如上所述,使用REPLACE:

REPLACE INTO my_table (num1, num2, num3) VALUES (1, 2, 3);

(请注意,它们有两种不同的作用。您可能希望阅读我对"INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE"的回答。)

  

此查询的问题是麻烦。想象一个有20列的表格。我将不得不再次写所有列名。

嗯。计算机上的“复制和粘贴”按钮是否损坏?

也许您希望我们为您修剪面包皮? (开玩笑)

老实说,有时软件开发需要一些工作。键入20个列名并不是您本周要做的最无聊的事情。

答案 1 :(得分:1)

问好MySQL的REPLACE

每个mySQL文档:

  

REPLACE的工作方式与INSERT完全相同,不同之处在于,如果   表具有与PRIMARY KEY或UNIQUE的新行相同的值   索引,则在插入新行之前删除旧行

因此,您可以简单地

REPLACE INTO my_table (num1, num2, num3) VALUES (1,2,3);

如果该行不存在,它将作为常规INSERT使用。如果确实存在,它将被删除并插入(在您的眼中,它看起来像是UPDATE

被告知。无论您在做什么,都可能总是想使用REPLACE而不是INSERT。那样会很不方便(我学到了很难的方法),因为“替换”有更多的开销