MySQL如果數據存在則更新,不存在則插入

如果數據存在則更新,不存在則插入,MySQL有duplicate、replace into、replace三種方式如何更新數據?
insert ignore into 又是如何插入數據的呢?

準備表和基礎數據

測試MySQL版本:8.0.35

use testdb;
#drop table tb_student;
CREATE TABLE `tb_student` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '自增',
  `num` int not null default 0 COMMENT '',
  `name` varchar(30) DEFAULT '' COMMENT 'appid',
  `address` varchar(100) default '' COMMENT '家庭地址',
  `mobile` varchar(30) DEFAULT '' COMMENT '手機號',
   primary key (id),
   unique key idx_num(num)
   ) ENGINE=InnoDB comment ='學生信息';
   
select * from tb_student;

測試 INSERT INTO ... ON DUPLICATE KEY UPDATE

功能: MySQL語法支持如果數據存在則更新,不存在則插入,首先判斷數據存在還是不存在的那個字段要設置成unique索引。
語法: INSERT INTO 表名(唯一索引列, 列2, 列3) VALUE(值1, 值2, 值3) ON DUPLICATE KEY UPDATE 列=值, 列=值

初始化第一條數據

insert into tb_student (num,name,address,mobile)values(1,'張三','上海','18111111111');

不存在則插入

insert into tb_student(num,name,mobile) values(10,'李四','13100000000') on duplicate key update name='李四',mobile='1310000000';

存在則更新

從下面的結果可以看出,第二條記錄主鍵id=2並沒有變化,on duyplicate key update 直接在原記錄上更新字段值。

insert into tb_student(num,name,mobile) values(10,'李四','13188888888') on duplicate key update name='李四',mobile='13188888888';

INSERT部分,未指明唯一索引列有兩種情況:

  1. 如果表中不存在索引列默認值(這裏是int,默認值指定的是0)的記錄,則直接插入,索引列爲默認值;
  2. 如果表中存在索引列默認值記錄時,則更新索引字段爲默認值記錄的其他數據。

insert into tb_student(id,name,mobile) values(3,'王五','15611111111') on duplicate key update name='王五',mobile='15611111111';

第二次未指明唯一索引列插入數據,從下面的結果看出,王五的數據被劉麻子的數據更新掉了。

insert into tb_student(id,name,mobile) values(4,'劉麻子','15899999999') on duplicate key update name='劉麻子',mobile='15899999999';

on duplicate key update特點
  • DUPLICATE不會刪除原有的記錄。即:不會破壞索引。
  • 不指定唯一索引列時,直接將數據插入表中,索引列是默認值,如果表中已經存在索引列默認值時,就將索引列爲默認值的數據更新掉。

測試 REPLACE INTO

REPLACE INTO 主要作用類似 INSERT 插入操作。主要的區別是 REPLACE INTO 會根據主鍵或者唯一索引檢查數據是否存在,如果存在就先刪除再更新。

  • 語法:REPLACE INTO 表名稱(列1, 列2, 列3) VALUES(值1, 值2, 值3)
不存在則插入

replace into tb_student(num, name, mobile) VALUES(30, '劉備', '13122222222');

注意:此時的主鍵id=4

存在則先刪除後插入

注意:從下面的結果上看,此時的主鍵id=4的一條記錄被刪除,重新插入了一條主鍵id=5的新記錄。

replace into tb_student(num, name, mobile) VALUES(30, '劉備', '13122222222');

REPLACE INTO 特點

REPLACE INTO底層是先刪除後插入數據,會破壞索引、重新維護索引。
必須要有主鍵或唯一索引纔能有效,否則replace into就只新增了。
測試REPLACE
replace是mysql 裏面處理字符串比較常用的函數,可以替換字符串中的內容。類似的處理字符串的還有trim截取操作。

  • 語法:replace(object,search,replace)
查詢結果替換

select replace('aaabbbcccc','b','d');

更新數據

update tb_student set address=replace(address,'上','青') where id=1;

測試insert ignore into

如果插入的數據在表中已經存在(主鍵或者唯一鍵已存在),使用insert ignore 語法可以忽略插入重複的數據。

  • 語法:insert ignore into table_name values…
主鍵不衝突,直接插入

insert ignore into tb_student(id, num,name, mobile) VALUES(6, 40,'張飛', '13144444444');

主鍵衝突,忽略插入

insert ignore into tb_student(id, num,name, mobile) VALUES(6, 40,'趙雲', '13155555555');

去掉ignore,SQL報異常

insert into tb_student(id, num,name, mobile) VALUES(6, 40,'趙雲', '13155555555');

插入語句不指定索引列時的兩種情況
  1. 如果表中不存在索引列默認值(這裏是int,默認值指定的是0)的記錄,則直接插入,索引列爲默認值;
  2. 如果表中存在索引列默認值記錄時,則插入不成功,因爲和默認值的唯一索引衝突了。

總結:

on duplicate key update特點
  • DUPLICATE不會刪除原有的記錄。即:不會破壞索引。
  • 不指定唯一索引列時,直接將數據插入表中,索引列是默認值,如果表中已經存在索引列默認值時,就將索引列爲默認值的數據更新掉。
replace into特點
  • REPLACE INTO底層是先刪除後插入數據,會破壞索引、重新維護索引。
  • 必須要有主鍵或唯一索引纔能有效,否則replace into就只新增了。
replace特點
  • replace是MySQL裏面處理字符串比較常用的函數,可以替換字符串中的內容。
insert ignore into特點
  • 主鍵衝突時,忽略本次插入的數據,否則正常插入。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章