1. INSERT INTO
insert into表示插入數(shù)據(jù)敞斋,數(shù)據(jù)庫會檢查主鍵(PrimaryKey)吞杭,如果出現(xiàn)重復會報錯龟虎;
2. INSERT IGNORE
insert ignore 如果存在數(shù)據(jù)河爹,那么則忽略新數(shù)據(jù)匠璧。也是mysql三種防止重復插入數(shù)據(jù)的方式之一
3. REPLACE INTO
replace into 表示插入替換數(shù)據(jù),表中如果有PrimaryKey或者unique索引的話咸这,數(shù)據(jù)庫如果已存在數(shù)據(jù)夷恍,則用新數(shù)據(jù)替換,如果沒有數(shù)據(jù)則和insert into一樣媳维。也是mysql三種防止重復插入數(shù)據(jù)的方式之一
replace語句返回一個數(shù)酿雪,指的是受影響的數(shù)據(jù)條數(shù)。該數(shù)指的是刪除和插入一共影響的數(shù)據(jù)條數(shù)侄刽,如果返回1指黎,說明沒有數(shù)據(jù),只進行一次插入操作唠梨。如果返回的大于1袋励,說明刪除了數(shù)據(jù)之后,在進行插入的。由于唯一索引的原因茬故,可能執(zhí)行一次操作會影響多少數(shù)據(jù)盖灸。也就是刪除多條,然后插入一條新數(shù)據(jù)磺芭。
下圖為演示效果赁炎,id為主鍵(PrimaryKey)
INSERT INTO `level_user` (id,level_id,user_code,create_time,create_code) VALUES(1,1,1,NOW(),'ceshi')
第一次執(zhí)行:
第二次執(zhí)行:因為主鍵已存在,拋出異常
目前數(shù)據(jù)庫的數(shù)據(jù)結(jié)果:
INSERT IGNORE `level_user` (id,level_id,user_code,create_time,create_code) VALUES(1,1,1,NOW(),'ceshi')
在上面結(jié)果基礎上在執(zhí)行第二條sql钾腺,執(zhí)行成功了徙垫,但是受影響數(shù)據(jù)條數(shù)為0,說明沒有更新
此時數(shù)據(jù)庫的數(shù)據(jù)結(jié)果:結(jié)果沒有任何改變放棒。
REPLACE INTO `level_user` (id,level_id,user_code,create_time,create_code) VALUES(1,3,3,NOW(),'ceshi')
在上面結(jié)果基礎上在執(zhí)行第三條sql姻报,執(zhí)行成功了,受影響條數(shù)為2间螟,說明刪除了之后然后進行插入的吴旋,數(shù)據(jù)已經(jīng)變了
此時數(shù)據(jù)庫的數(shù)據(jù)結(jié)果:結(jié)果已經(jīng)發(fā)生改變。
第三種mysql防止重復插入數(shù)據(jù)的方式:ON DUPLICATE KEY UPDATE
根據(jù)唯一主鍵或者唯一索引厢破,如果沒有數(shù)據(jù)則插入荣瑟,如果存在數(shù)據(jù),則可以根據(jù)自己的情況更新某些值摩泪,sql舉例如下:
INSERT INTO `level_user` (id,level_id,user_code,create_time,create_code)
VALUES(1,1,1,NOW(),'ceshi')
ON DUPLICATE KEY UPDATE
create_time=NOW()