Mysql如何實現(xiàn)不存在則插入,存在則更新
數(shù)據(jù)準備

ON DUPLICATE KEY UPDATE
insert into test_table(id,username) VALUES(4,'fukaiit') ON DUPLICATE KEY UPDATE username='fukaiit'
執(zhí)行如上sql,該id不存在(此處id不存在,指的是id為X的記錄不存在,包括主鍵、unique索引列等情況),相當于執(zhí)行了insert部分,普通插入,受影響的行:1。
insert into test_table(id,username) VALUES(1,'fukaiit') ON DUPLICATE KEY UPDATE username='fukaiit'
執(zhí)行如上sql,該id已存在,相當于執(zhí)行了update部分,受影響的行:2。
執(zhí)行結果如下,注意只是更新username,是保留了email的。

REPLACE INTO … VALUES…
REPLACE INTO test_table(id,username) VALUES(5,'fukaiit');
執(zhí)行如上sql,該id不存在,相當于執(zhí)行了insert,普通插入,受影響的行:1。
REPLACE INTO test_table(id,username) VALUES(1,'fukaiit');
執(zhí)行如上sql,該id已存在,相當于執(zhí)行了刪除再插入的操作,受影響的行:2。
執(zhí)行結果如下,注意刪除后再插入是沒有email值的,所以此時email為null,注意與ON DUPLICATE KEY UPDATE的區(qū)別。

無論是insert on duplicate key update還是replace into,在插入時MySQL返回的影響行數(shù)就是插入的記錄數(shù),但是在更新時返回的影響行數(shù)是更新行數(shù)*2。
INSERT IGNORE INTO … VALUES…
INSERT IGNORE INTO test_table(id,username)? values(6,'fukaiit');
執(zhí)行如上sql,該id不存在,相當于執(zhí)行了insert,普通插入,受影響的行:1。
INSERT IGNORE INTO test_table(id,username)? values(1,'fukaiit_new');
執(zhí)行如上sql,該id已存在,忽略了該插入操作,數(shù)據(jù)沒有變化,受影響的行: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);
執(zhí)行如上sql,該id不存在,select子句返回結果集為空,NOT EXISTS成立,相當于執(zhí)行了insert,普通插入,受影響的行:1。
INSERT INTO test_table(id,username) SELECT 2,'fukaiit' from DUAL? where NOT EXISTS (select * from test_table where id=2);
執(zhí)行如上sql,該id已存在,select子句返回結果集不為空,NOT EXISTS不成立,則未執(zhí)行插入操作,數(shù)據(jù)沒有變化,受影響的行:0。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
MySQL高級學習筆記(三):Mysql邏輯架構介紹、mysql存儲引擎詳解
這篇文章主要介紹了Mysql邏輯架構介紹、mysql存儲引擎,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04
mysql實現(xiàn)批量修改字段null值改為空字符串
這篇文章主要介紹了mysql實現(xiàn)批量修改字段null值改為空字符串,具有很好的參考價值,希望對大家有所幫助。2022-08-08
MySQL如何快速創(chuàng)建800w條測試數(shù)據(jù)表
這篇文章主要介紹了MySQL如何快速創(chuàng)建800w條測試數(shù)據(jù)表,下面文章圍繞MySQL創(chuàng)建測試數(shù)據(jù)表的相關資料展開詳細內容,具有一的的參考價值,需要的小伙伴可以參考一下2022-03-03
mysql提示Changed limits: max_open_files: 2048 max_connections:
這篇文章主要介紹了mysql提示Changed limits: max_open_files: 2048 max_connections: 1910 table_cache: 64的解決,需要的朋友可以參考下2014-05-05

