生活随笔
收集整理的這篇文章主要介紹了
MySQL主键唯一键重复插入解决方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們插入數據的時候,有可能碰到重復數據插入的問題,但是這些數據又是不被允許有重復值:
CREATE TABLE stuInfo?( id INT NOT NULL COMMENT?'序號', name VARCHAR(20)?NOT NULL DEFAULT?''?COMMENT?'姓名', age INT NOT NULL DEFAULT?0?COMMENT?'年齡', PRIMARY KEY?(id), UNIQUE KEY uniq_name(name) )?ENGINE=InnoDB?DEFAULT CHARSET=utf8 COMMENT='學生表';
?
mysql>?INSERT INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20),(1,'xiaosi',25),(2,'aa',24); ERROR?1062?(23000):?Duplicate?entry?'1'?for?key?'PRIMARY'
解決方案:
1. IGNORE
使用ignore當插入的值遇到主鍵(PRIMARY KEY)或者唯一鍵(UNIQUE KEY)重復時自動忽略重復的記錄行,不影響后面的記錄行的插入。
INSERT IGNORE INTO stuInfo?(name,birthday,is_deleted)?VALUES?('yoona','1990-01-05',0),('aa','1990-01-16',0),('bb','1990-01-17',0);
運行結果:
mysql>?INSERT IGNORE INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20),(1,'xiaosi',25),(2,'aa',24); Query?OK,?2?rows affected?(0.02?sec) Records:?3?Duplicates:?1?Warnings:?0 mysql>?select?*?from?stuInfo; +----+-------+-----+ |?id?|?name?|?age?| +----+-------+-----+ |?1?|?yoona?|?20?| |?2?|?aa?|?24?| +----+-------+-----+ 2?rows?in?set?(0.00?sec)
我們可以從運行結果中看出,只有兩行受到影響,意思即(1,'yoona',20)數據插入,(1,'xiaosi',25)重復數據自動被忽略,(2,'aa',24)不重復數據繼續插入,不會受到重復數據的影響;
2.?REPLACE
使用replace當插入的記錄遇到主鍵或者唯一鍵重復時先刪除表中重復的記錄行再插入。
mysql>?REPLACE INTO stuInfo?(name,birthday,is_deleted)?VALUES?('yoona','1990-01-15',0),('yoona','1990-02-16',0),('aa','1990-01-13',0); Query?OK,?4?rows affected?(0.02?sec) Records:?3??Duplicates:?1??Warnings:?0
運行結果:
mysql>?select?*?from?stuInfo;?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??+----+-------+------------+------------+ |?id?|?name ?|?birthday ??|?is_deleted?| +----+-------+------------+------------+ |?21?|?yoona?|?1990-02-16?|?? ? ? ? ?0?| |?22?|?aa ? ?|?1990-01-13?|?? ? ? ? ?0?| +----+-------+------------+------------+ 2?rows?in?set?(0.00?sec)
從輸出的信息可以看到是4行受影響,說明它是先插入了('yoona','1990-01-15',0)然后又刪除了('yoona','1990-01-15',0)。
3.?ON DUPLICATE KEY UPDATE
當插入的記錄遇到主鍵或者唯一鍵重復時,會執行后面定義的UPDATE操作。相當于先執行Insert 操作,再根據主鍵或者唯一鍵執行update操作。
DROP TABLE ?IF EXISTS stuInfo; CREATE TABLE stuInfo?( ?id INT NOT NULL COMMENT?'序號', ?name VARCHAR(20)?NOT NULL DEFAULT?''?COMMENT?'姓名', ?age INT NOT NULL DEFAULT?0?COMMENT?'年齡', ?PRIMARY KEY?(id), ?UNIQUE KEY uniq_name(name) )?ENGINE=InnoDB?DEFAULT CHARSET=utf8 COMMENT='學生表';
?
在ON DUPLICATE KEY UPDATE后VALUES解釋:
VAULES(age)指的是待插入的記錄的值
age指得是表的自身值,已插入值。
(1)第一種情形:
#VALUES(age) 待插入值 25 INSERT INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20),(1,'xiaosi',25)?ON DUPLICATE KEY UPDATE age?=?VALUES(age)?+?1;
相當于:
INSERT INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20); UPDATE stuInfo SET age?=?VALUES(age)?+?1 WHERE id?=?1;
運行結果:
mysql>?INSERT INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20),(1,'xiaosi',25)?ON DUPLICATE KEY UPDATE age?=?VALUES(age)?+?1; Query?OK,?3?rows affected?(0.01?sec) Records:?2?Duplicates:?1?Warnings:?0 mysql>?select?*?from?stuInfo; +----+-------+-----+ |?id?|?name?|?age?| +----+-------+-----+ |?1?|?yoona?|?26?| +----+-------+-----+ 1?row?in?set?(0.00?sec)
?
(2)第二種情形:
#age 已插入值 20 INSERT INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20),(1,'xiaosi',25)?ON DUPLICATE KEY UPDATE age?=?age?+?1;
相當于:
INSERT INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20); UPDATE stuInfo SET age?=?age?+?1 WHERE id?=?1;
運行結果:
mysql>?INSERT INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20),(1,'xiaosi',25)?ON DUPLICATE KEY UPDATE age?=?age?+?1; Query?OK,?3?rows affected?(0.02?sec) Records:?2?Duplicates:?1?Warnings:?0 mysql>?select?*?from?stuInfo; +----+-------+-----+ |?id?|?name?|?age?| +----+-------+-----+ |?1?|?yoona?|?21?| +----+-------+-----+ 1?row?in?set?(0.00?sec)
?
如果遇到重復插入的數據的情形,ON DUPLICATE KEY UPDATE用來對已插入的數據進行修改,可以使用獲取重復已插入數據(直接使用字段名稱),也可以獲取重復待插入數據(values(字段名稱))。我們不會對重復待插入數據進行插入操作。
重復已插入數據:上例中的(1,'yoona',20)
重復待插入數據:上例中的(1,'yoona',25)
總結
以上是生活随笔為你收集整理的MySQL主键唯一键重复插入解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。