Mysql

INSERT… ON DUPLICATE KEY UPDATE 沒有按我的預期工作

  • June 17, 2020

我有一個名為“範例”的表

CREATE TABLE IF NOT EXISTS `example` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `a` int(11) NOT NULL,
 `b` int(11) NOT NULL,
 `c` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

如果不存在,我想插入值,如果值存在則更新,所以我使用以下語句:

INSERT INTO example (a, b, c) VALUES (1,2,3) 
 ON DUPLICATE KEY UPDATE a = VALUES(a), b = VALUES(b), c = VALUES(c);

執行上述查詢後,表如下所示:

在此處輸入圖像描述

我再次執行上面的語句,結果如下所示:

在此處輸入圖像描述

我的陳述有什麼問題?

您的原始查詢

INSERT INTO example (a, b, c) VALUES (1,2,3) ON DUPLICATE KEY
UPDATE a = VALUES(a), b = VALUES(b), c = VALUES(c);

如果您考慮(a,b,c)使用唯一鍵,則需要做兩件事

一、添加唯一索引

ALTER TABLE example ADD UNIQUE KEY abc_ndx (a,b,c);

所以表結構會變成

CREATE TABLE IF NOT EXISTS `example` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `a` int(11) NOT NULL,
 `b` int(11) NOT NULL,
 `c` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY abc_ndx (a,b,c)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

其次,您需要完全更改查詢。為什麼 ?

如果(a,b,c)是唯一的,則執行

INSERT INTO example (a, b, c) VALUES (1,2,3) ON DUPLICATE KEY
UPDATE a = VALUES(a), b = VALUES(b), c = VALUES(c);

將保持(a,b,c)完全相同的值。什麼都不會改變。

因此,我建議將查詢更改為以下

INSERT IGNORE INTO example (a, b, c) VALUES (1,2,3);

查詢更簡單,並且具有相同的最終結果。

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