向資料表 INSERT 時遇唯一鍵/主鍵重複會拋出 Duplicate key 錯誤。以下以 user(userid PK, username) 為例,說明三種交由 MySQL 直接處理的高效方案。
CREATE TABLE `user` (`userid` INT(11), `username` VARCHAR(255) NOT NULL DEFAULT '');
ALTER TABLE `user` ADD PRIMARY KEY `userid` (`userid`);
INSERT INTO `user` VALUES (1, 'eric'), (2, 'jesus');
DELETE FROM user WHERE userid = 1;
INSERT INTO user VALUES (1, 'xxxxx');
兩條語句,需自行控制交易。
REPLACE INTO user VALUES (1, 'newvalue');
邏輯:存在則先刪除再插入。affected rows = 2(刪1+增1)。
INSERT INTO user VALUES (1, 'newvalueagain')
ON DUPLICATE KEY UPDATE username = VALUES(username);
不存在則插入,存在則更新指定欄位。affected rows = 2(1=新增/2=更新)。單一語句、原子性、效能最佳。
SELECT 判斷再決定 INSERT/UPDATEUPDATE,affected rows=0 再 INSERT上述皆需多次往返資料庫,不如方案 2、3 高效。