数据库
首页 > 数据库> > mysql – INSERT INTO … ON DUPLICATE KEY UPDATE即使行没有改变也会执行?

mysql – INSERT INTO … ON DUPLICATE KEY UPDATE即使行没有改变也会执行?

作者:互联网

让我解释 :

我们假设我们有一个数据库“user”:

ID   Name   Surname
===================
1    John   Doe
2    Foo    Bar
3    Foo    Baz

现在我想改变所有这三行.我将抛出以下插入内容:

INSERT INTO user (ID, Name, Surname) VALUES (1, 'John', 'Conor') ON DUPLICATE KEY UPDATE ID = 1, Name = 'John', Surname = 'Conor';
INSERT INTO user (ID, Name, Surname) VALUES (2, 'Foo', 'Bar') ON DUPLICATE KEY UPDATE ID = 2, Name = 'Foo', Surname = 'Bar';
INSERT INTO user (ID, Name, Surname) VALUES (3, 'Foo', 'Baz') ON DUPLICATE KEY UPDATE ID = 3, Name = 'Foo', Surname = 'Baz';

如果更新前的行是相同的,命令ON DUPLICATE KEY是否会自行执行?意思是,它是否会对ID等于2和3的行执行,即使它不应该执行(因为它没用)?我问这个问题的性能问题.

解决方法:

MySQL执行ON DUPLICATE KEY UPDATE的方式与执行UPDATE语句的方式相同:

它检查要更新的每行(和列)的内容,如果它们与提供的相同,则不会进行任何更新.它仍然需要检查它们.

因此,在您的情况下(您要发送3行插入的地方)的结果将是:

>要插入3行
> 3次关键碰撞

>插入0行
> 3要更新

> 1行实际更新
> 2相同(无更新)

关于语法的一些事情:

>您不需要更新UNIQUE键.
>您可以在UPDATE部分中使用VALUES(列).
>您可以将多个插入组合成一个:

INSERT INTO user 
  (ID, Name, Surname) 
VALUES 
  (1, 'John', 'Conor'),
  (2, 'Foo',  'Bar'),
  (3, 'Foo',  'Baz') 
ON DUPLICATE KEY UPDATE 
  Name = VALUES(Name), 
  Surname = VALUES(Surname) ;

标签:mysql,insert,duplication,update
来源: https://codeday.me/bug/20190806/1601958.html