即使行没有更改,INSERT INTO ... ON DUPLICATE KEY UPDATE 也会执行吗?

Anw*_*war 2 mysql insert duplication update

让我解释 :

让我们假设我们有一个数据库“用户”:

ID   Name   Surname
===================
1    John   Doe
2    Foo    Bar
3    Foo    Baz
Run Code Online (Sandbox Code Playgroud)

现在我想更改所有这三行。我将抛出以下插入:

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';
Run Code Online (Sandbox Code Playgroud)

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

ype*_*eᵀᴹ 6

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

它检查要更新的每一行(和列)的内容,如果它们与提供的内容相同,则不进行任何更新。尽管如此,它仍然必须检查它们。

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

  • 要插入的 3 行
  • 3键冲突
    • 已插入 0 行
    • 3 待更新
      • 1 行实际更新
      • 2 相同(无更新)

关于你的语法的一些事情:

  • 您不需要更新UNIQUE密钥。
  • 您可以VALUES(column)UPDATE零件中使用。
  • 您可以将多个插入合并为一个:

    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) ;
    
    Run Code Online (Sandbox Code Playgroud)