1. 程式人生 > >MySql 不存在則插入,存在則更新或忽略

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,表資料不變。