教你Mysql如何實現不存在則插入,存在則更新

roc_guo發表於2022-04-12
資料準備

教你Mysql如何實現不存在則插入,存在則更新教你Mysql如何實現不存在則插入,存在則更新

ON DUPLICATE KEY UPDATE
insert into test_table(id,username)
VALUES(4,'fukaiit')
ON DUPLICATE KEY UPDATE username='fukaiit'

執行如上sql,該id不存在(此處id不存在,指的是id為X的記錄不存在,包括主鍵、unique索引列等情況),相當於執行了insert部分,普通插入,受影響的行:1。

insert into test_table(id,username)
VALUES(1,'fukaiit')

ON DUPLICATE KEY UPDATE username='fukaiit'
執行如上sql,該id已存在,相當於執行了update部分,受影響的行:2。

執行結果如下,注意只是更新username,是保留了email的。

教你Mysql如何實現不存在則插入,存在則更新教你Mysql如何實現不存在則插入,存在則更新

REPLACE INTO … VALUES…
REPLACE INTO test_table(id,username)
VALUES(5,'fukaiit');

執行如上sql,該id不存在,相當於執行了insert,普通插入,受影響的行:1。

REPLACE INTO test_table(id,username)
VALUES(1,'fukaiit');

執行如上sql,該id已存在,相當於執行了刪除再插入的操作,受影響的行:2。

執行結果如下,注意刪除後再插入是沒有email值的,所以此時email為null,注意與ON DUPLICATE KEY UPDATE的區別。

教你Mysql如何實現不存在則插入,存在則更新教你Mysql如何實現不存在則插入,存在則更新

無論是insert on duplicate key update還是replace into,在插入時MySQL返回的影響行數就是插入的記錄數,但是在更新時返回的影響行數是更新行數*2。

INSERT IGNORE INTO … VALUES…
INSERT IGNORE INTO test_table(id,username) 
values(6,'fukaiit');

執行如上sql,該id不存在,相當於執行了insert,普通插入,受影響的行:1。

INSERT IGNORE INTO test_table(id,username) 
values(1,'fukaiit_new');

執行如上sql,該id已存在,忽略了該插入操作,資料沒有變化,受影響的行:0。

使用DUAL虛表和NOT EXISTS

該方法與INSERT IGNORE INTO ... VALUES...方法的效果相同。

INSERT INTO test_table(id,username)
SELECT 7,'fukaiit' from DUAL 
where NOT EXISTS (select * from test_table where id=7);

執行如上sql,該id不存在,select子句返回結果集為空,NOT EXISTS成立,相當於執行了insert,普通插入,受影響的行:1。

INSERT INTO test_table(id,username)
SELECT 2,'fukaiit' from DUAL 
where NOT EXISTS (select * from test_table where id=2);

執行如上sql,該id已存在,select子句返回結果集不為空,NOT EXISTS不成立,則未執行插入操作,資料沒有變化,受影響的行:0。

以上為個人經驗,希望能給大家一個參考


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2886629/,如需轉載,請註明出處,否則將追究法律責任。

相關文章