插入SQL語句的使用


一. 概述

  1. 總結
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);
  1. 插入語句總結
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);
  1. 更新語句總結
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;
  1. 刪除語句總結
SQL語句 場景 執行結果 影響行數 主鍵是否自增 示例
delete 正常情況 執行成功 1行受影響 - delete from names where name=‘333’;
delete 沒有該條記錄 執行成功 0行受影響 - delete from names where name=‘3333131’;
  1. 創建測試表並插入初始數據
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

  1. 概述
    • 表示插入新數據。
    • 如果出現重複唯一索引值,id會自增,但插入不成功,會報錯。
    • 如果出現重複主鍵,id不會自增,則插入不成功,報錯。
  2. 示例
# 已存在:id自增,插入不成功,報錯
insert into names(name, age) values("xixi", 24); # id+1
  • 結果:Error Code: 1062. Duplicate entry 'xixi' for key 'name'

2. insert ignore into

  1. 概述
    • 表示忽略老數據。
    • 如果新數據與數據庫已有數據的唯一索引重複,則忽略當前新數據;否則,效果和insert into一樣。
    • 如果新數據與數據庫已有數據的主鍵重複,則忽略當前新數據。
    • 要求表中必須有主鍵或唯一索引;否則,則會插入新數據。
  2. 示例
# 已存在:忽略新記錄,id自增,不會報錯
insert ignore into names(name, age) values("xixi", 24); # id+1

# 不存在:添加新記錄
insert into names(name, age) values("xiaoxue", 24);
  • 結果
    在這裏插入圖片描述

3. replace into

  1. 概述
    • 表示替換老數據。REPLACE = DELETE和INSERT,即刪除舊記錄,新增新記錄
    • 如果新數據與數據庫已有數據的主鍵或唯一索引重複,則用新數據替換;否則,效果和insert into一樣。
    • 要求表中必須有主鍵或唯一索引;否則,則會插入新數據。
    • 執行REPLACE後,系統返回了所影響的行數:
      • 如果返回值等於1,說明表中沒有重複記錄;
      • 如果返回值等於2,說明有一條重複記錄;
      • 如果返回值大於2,說明有多個唯一索引,有多條記錄被刪除和插入。
  2. 示例
# 已存在:刪除老記錄,添加新記錄
replace into names(name, age) values("xiaoxue", 24);

# 不存在:添加新記錄
replace into names(name, age) values("xiaoyu", 29);
  • 結果
    在這裏插入圖片描述
  1. ⚠️多個唯一索引的情況
  • 表結構
    在這裏插入圖片描述

  • 初始查詢

select * from test.tx;

在這裏插入圖片描述

  • 執行插入
replace into test.tx(c1,c2) values(13,25);
  • 結果:刪除了id=37和id=38的兩條記錄,插入id=41的一條記錄。可以看出,有多個唯一索引的情況,可能會用一條記錄替換多條記錄。
    在這裏插入圖片描述

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章