生活随笔
收集整理的這篇文章主要介紹了
MySQL主键唯一键重复插入解决方法
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
我們插入數(shù)據(jù)的時(shí)候,有可能碰到重復(fù)數(shù)據(jù)插入的問(wèn)題,但是這些數(shù)據(jù)又是不被允許有重復(fù)值:
CREATE TABLE stuInfo?( id INT NOT NULL COMMENT?'序號(hào)', 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='學(xué)生表';
?
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當(dāng)插入的值遇到主鍵(PRIMARY KEY)或者唯一鍵(UNIQUE KEY)重復(fù)時(shí)自動(dòng)忽略重復(fù)的記錄行,不影響后面的記錄行的插入。
INSERT IGNORE INTO stuInfo?(name,birthday,is_deleted)?VALUES?('yoona','1990-01-05',0),('aa','1990-01-16',0),('bb','1990-01-17',0);
運(yùn)行結(jié)果:
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)
我們可以從運(yùn)行結(jié)果中看出,只有兩行受到影響,意思即(1,'yoona',20)數(shù)據(jù)插入,(1,'xiaosi',25)重復(fù)數(shù)據(jù)自動(dòng)被忽略,(2,'aa',24)不重復(fù)數(shù)據(jù)繼續(xù)插入,不會(huì)受到重復(fù)數(shù)據(jù)的影響;
2.?REPLACE
使用replace當(dāng)插入的記錄遇到主鍵或者唯一鍵重復(fù)時(shí)先刪除表中重復(fù)的記錄行再插入。
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
運(yùn)行結(jié)果:
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行受影響,說(shuō)明它是先插入了('yoona','1990-01-15',0)然后又刪除了('yoona','1990-01-15',0)。
3.?ON DUPLICATE KEY UPDATE
當(dāng)插入的記錄遇到主鍵或者唯一鍵重復(fù)時(shí),會(huì)執(zhí)行后面定義的UPDATE操作。相當(dāng)于先執(zhí)行Insert 操作,再根據(jù)主鍵或者唯一鍵執(zhí)行update操作。
DROP TABLE ?IF EXISTS stuInfo; CREATE TABLE stuInfo?( ?id INT NOT NULL COMMENT?'序號(hào)', ?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='學(xué)生表';
?
在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;
相當(dāng)于:
INSERT INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20); UPDATE stuInfo SET age?=?VALUES(age)?+?1 WHERE id?=?1;
運(yùn)行結(jié)果:
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;
相當(dāng)于:
INSERT INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20); UPDATE stuInfo SET age?=?age?+?1 WHERE id?=?1;
運(yùn)行結(jié)果:
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)
?
如果遇到重復(fù)插入的數(shù)據(jù)的情形,ON DUPLICATE KEY UPDATE用來(lái)對(duì)已插入的數(shù)據(jù)進(jìn)行修改,可以使用獲取重復(fù)已插入數(shù)據(jù)(直接使用字段名稱),也可以獲取重復(fù)待插入數(shù)據(jù)(values(字段名稱))。我們不會(huì)對(duì)重復(fù)待插入數(shù)據(jù)進(jìn)行插入操作。
重復(fù)已插入數(shù)據(jù):上例中的(1,'yoona',20)
重復(fù)待插入數(shù)據(jù):上例中的(1,'yoona',25)
總結(jié)
以上是生活随笔為你收集整理的MySQL主键唯一键重复插入解决方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。