Mysql

即使行沒有更改,INSERT INTO … ON DUPLICATE KEY UPDATE 也會執行嗎?

  • February 20, 2017

讓我解釋 :

讓我們假設我們有一個數據庫“使用者”:

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密鑰。
  • 您可以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) ;

引用自:https://dba.stackexchange.com/questions/164877