詳解MySQL主鍵唯一鍵重復(fù)插入解決方法
我們插入數(shù)據(jù)的時(shí)候,有可能碰到重復(fù)數(shù)據(jù)插入的問題,但是這些數(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行受影響,說明它是先插入了(‘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用來對(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)
到此這篇關(guān)于詳解MySQL主鍵唯一鍵重復(fù)插入解決方法的文章就介紹到這了,更多相關(guān)MySQL主鍵唯一鍵重復(fù)插入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用dreamhost空間實(shí)現(xiàn)MYSQL數(shù)據(jù)庫備份方法
使用dreamhost空間實(shí)現(xiàn)MYSQL數(shù)據(jù)庫備份方法...2007-07-07
Mysql之如何根據(jù).frm和.idb文件恢復(fù)表結(jié)構(gòu)
這篇文章主要介紹了Mysql之如何根據(jù).frm和.idb文件恢復(fù)表結(jié)構(gòu)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
MySQL NDB Cluster關(guān)于Nginx stream的負(fù)載均衡配置方式
這篇文章主要介紹了MySQL NDB Cluster關(guān)于Nginx stream的負(fù)載均衡配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
淺析如何保證MySQL與Redis數(shù)據(jù)一致性
在互聯(lián)網(wǎng)應(yīng)用中,MySQL作為持久化存儲(chǔ)引擎,Redis作為高性能緩存層,兩者的組合能有效提升系統(tǒng)性能,下面我們來看看如何保證兩者的數(shù)據(jù)一致性吧2025-06-06
mysql 動(dòng)態(tài)執(zhí)行存儲(chǔ)過程語句
MSSQL中動(dòng)態(tài)執(zhí)行sql語句可以使用EXEC()函數(shù)。MSSQL中也有類似的函數(shù)EXECUTE(),不過不同的是MYSQL中動(dòng)態(tài)執(zhí)行存儲(chǔ)過程語句與MSSQL還是有區(qū)別的。2009-07-07
MySQL FIND_IN_SET 函數(shù)實(shí)戰(zhàn)實(shí)例
FIND_IN_SET是MySQL處理分隔字符串的函數(shù),用于判斷字符串是否存在于列表中,返回位置或0,適用于標(biāo)簽、分類等多值場(chǎng)景,但無法使用索引,性能較差,建議結(jié)合替代方案或優(yōu)化設(shè)計(jì),注意大小寫敏感和空值處理問題,對(duì)mysql find_in_set函數(shù)感興趣的朋友一起看看吧2025-07-07

