一. 概述
- 總結
SQL語句 |
含義 |
數據庫中已存在 |
數據庫中不存在 |
結果 |
舉例 |
insert into |
插入新數據 |
報錯 |
插入 |
主鍵自增 |
insert into names(name, age) values(“小明”, 23); |
insert ignore into |
忽略老數據 |
忽略 |
插入 |
主鍵自增 |
insert ignore into names(name, age) values(“小明”, 24); |
replace into |
替換老數據 |
替換 |
插入 |
主鍵自增 |
replace into names(name, age) values(“小明”, 25); |
- 插入語句總結
SQL語句 |
場景 |
執行結果 |
影響行數 |
主鍵是否自增 |
示例 |
insert into |
唯一索引重複 |
ERROR |
- |
主鍵自增 |
insert into names(name,age) values(‘dadadda’,12); |
insert into |
主鍵重複 |
ERROR |
- |
主鍵不自增 |
insert into names(id,name,age) values(15,‘hihdadasdadih’,12); |
insert ignore into |
唯一索引重複 |
WARNING |
0行受影響 |
主鍵自增 |
insert ignore into names(name,age) values(‘dadadda’,12); |
insert ignore into |
主鍵重複 |
WARNING |
0行受影響 |
主鍵不自增 |
insert ignore into names(id,name,age) values(14,‘dajsldjal’,12); |
replace into |
唯一索引重複 |
執行成功 |
2行受影響 |
刪除舊記錄,新記錄 |
replace into names(name, age) values(“xiaoxue”, 24); |
replace into |
主鍵重複 |
執行成功 |
2行受影響 |
直接替換該行記錄,id不會改變 |
replace into names(id,name, age) values(22,“dasdasdsa”, 28); |
replace into |
主鍵和唯一索引都不重複 |
執行成功 |
1行受影響 |
與新增記錄一樣 |
replace into names(name, age) values(“好嗲速遞哦啊睡覺的”, 29); |
- 更新語句總結
SQL語句 |
場景 |
執行結果 |
影響行數 |
主鍵是否自增 |
示例 |
update |
舊數據和要更新的值完全一樣 |
執行成功 |
0行受影響 |
- |
update names set name=‘dasd’ where id=12; |
update |
沒有找到該條數據 |
執行成功 |
0行受影響 |
- |
update names set name=‘dasd’ where id=313421; |
update |
修改的唯一索引字段已有值 |
ERROR |
- |
- |
update names set name=‘qaa’ where id=4; |
- 刪除語句總結
SQL語句 |
場景 |
執行結果 |
影響行數 |
主鍵是否自增 |
示例 |
delete |
正常情況 |
執行成功 |
1行受影響 |
- |
delete from names where name=‘333’; |
delete |
沒有該條記錄 |
執行成功 |
0行受影響 |
- |
delete from names where name=‘3333131’; |
- 創建測試表並插入初始數據
CREATE TABLE names(
id INT(10) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) UNIQUE,
age INT(10)
);
select * from names;
insert into names(name, age) values("xixi", 24);
insert into names(name, age) values("houhou", 25);
insert into names(name, age) values("maomi", 26);
insert into names(name, age) values("liuxing", 27);
- 查詢結果
二. 詳解
1. insert into
- 概述
- 表示插入新數據。
- 如果出現重複唯一索引值,id會自增,但插入不成功,會報錯。
- 如果出現重複主鍵,id不會自增,則插入不成功,報錯。
- 示例
insert into names(name, age) values("xixi", 24);
- 結果:
Error Code: 1062. Duplicate entry 'xixi' for key 'name'
2. insert ignore into
- 概述
- 表示忽略老數據。
- 如果新數據與數據庫已有數據的唯一索引重複,則忽略當前新數據;否則,效果和insert into一樣。
- 如果新數據與數據庫已有數據的主鍵重複,則忽略當前新數據。
- 要求表中必須有主鍵或唯一索引;否則,則會插入新數據。
- 示例
# 已存在:忽略新記錄,id自增,不會報錯
insert ignore into names(name, age) values("xixi", 24); # id+1
# 不存在:添加新記錄
insert into names(name, age) values("xiaoxue", 24);
- 結果
3. replace into
- 概述
- 表示替換老數據。REPLACE = DELETE和INSERT,即刪除舊記錄,新增新記錄
- 如果新數據與數據庫已有數據的主鍵或唯一索引重複,則用新數據替換;否則,效果和insert into一樣。
- 要求表中必須有主鍵或唯一索引;否則,則會插入新數據。
- 執行REPLACE後,系統返回了所影響的行數:
- 如果返回值等於1,說明表中沒有重複記錄;
- 如果返回值等於2,說明有一條重複記錄;
- 如果返回值大於2,說明有多個唯一索引,有多條記錄被刪除和插入。
- 示例
replace into names(name, age) values("xiaoxue", 24);
replace into names(name, age) values("xiaoyu", 29);
- 結果
- ⚠️多個唯一索引的情況
-
表結構
-
初始查詢
select * from test.tx;
replace into test.tx(c1,c2) values(13,25);
- 結果:刪除了id=37和id=38的兩條記錄,插入id=41的一條記錄。可以看出,有多個唯一索引的情況,可能會用一條記錄替換多條記錄。
參考資料