假设我创建了下表:
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列的表格。我将不得不再次写所有列名。
您知道实现这一目标的任何优雅方法吗?
答案 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
。那样会很不方便(我学到了很难的方法),因为“替换”有更多的开销