MySql 不存在則插入,存在則更新或忽略
https://blog.csdn.net/t894690230/article/details/77996355
前言
在插入資料時,可能需要忽略或替換掉重複的資料(依據某個欄位),這時可以在應用層處理,也可以使用複雜的 SQL 語句來處理(如果僅僅知道一些簡單的 SQL 語法的話),當然也可以使用一些簡單的 SQL 語法,不過它並不是通用所有的資料庫型別。
以下所有例項僅針對MySQL而言,並不能隨意用於其它資料庫
例項
表名稱:student
表字段:
Column Name Primary Key Auto Increment Unique
id true true
name true
age
初始表資料:
id name age
1 Jack 18
注:以下所有的示例都需要被插入的資料中需要存在UNIQUE索引或PRIMARY KEY欄位,同時這裡引入表的主鍵id,並設定成自動遞增,後面可以看到它的變化
1. 不存在則插入,存在則更新
1.1 on duplicate key update
如果插入的資料會導致UNIQUE 索引或PRIMARY KEY發生衝突/重複,則執行UPDATE語句,例:
INSERT INTO `student`(`name`, `age`) VALUES('Jack', 19)
ON DUPLICATE KEY
UPDATE `age`=19; -- If will happen conflict, the update statement is executed
-- 2 row(s) affected
1
2
3
4
5
這裡受影響的行數是2,因為資料庫中存在name='Jack'的資料,如果不存在此條資料,則受影響的行數為1
最新的表資料如下:
id name age
1 Jack 19
1.2 replace into
如果插入的資料會導致UNIQUE 索引或PRIMARY KEY發生衝突/重複,則先刪除舊資料再插入最新的資料,例:
REPLACE INTO `student`(`name`, `age`) VALUES('Jack', 18);
-- 2 row(s) affected
1
2
3
這裡受影響的行數是2,因為資料庫中存在name='Jack'的資料,並且id的值會變成2,因為它是先刪除舊資料,然後再插入資料,最新的表資料如下:
id name age
2 Jack 19
2. 避免重複插入
關鍵字/句:insert ignore into,如果插入的資料會導致UNIQUE索引或PRIMARY KEY發生衝突/重複,則忽略此次操作/不插入資料,例:
INSERT IGNORE INTO `student`(`name`, `age`) VALUES('Jack', 18);
-- 0 row(s) affected
1
2
3
這裡已經存在name='Jack'的資料,所以會忽略掉新插入的資料,受影響行數為0,表資料不變。