MySQL 當記錄不存在時插入,當記錄存在時更新

2021-06-22 06:45:02 字數 4063 閱讀 8978

第一種:

示例一:插入多條記錄

假設有乙個主鍵為 client_id 的 clients 表,可以使用下面的語句:

insert

into

clients

(client_id

,client_name

,client_type

)select

supplier_id

,supplier_name,'

advertising

'from

suppliers

where

notexists

(select

*from

clients

where

clients

.client_id

=suppliers

.supplier_id);

示例一:插入單條記錄

insert

into

clients

(client_id

,client_name

,client_type

)select

10345,'

ibm','

advertising

'from

dual

where

notexists

(select

*from

clients

where

clients

.client_id

=10345);

使用 dual 做表名可以讓你在 select 語句後面直接跟上要插入欄位的值,即使這些值還不存在當前表中。

第二種:

insert 中on duplicate key update的使用

或primary key中出現重複值,則執行舊行update。例如,如果列a被定義為unique,並且包含值1,則以下兩個語句具有相同的效果:

mysql>insert into table (a,b,c) values (1,2,3)
->on duplicate key update c=c+1;
mysql>update table set c=c+1 where a=1;
如果行作為新記錄被插入,則受影響行的值為1;如果原有的記錄被更新,則受影響行的值為2。

注釋:如果列b也是唯一列,則insert與此update語句相當:

mysql>update table set c=c+1 where a=1 or b=2 limit 1;
如果a=1 or b=2與多個行向匹配,則只有乙個行被更新。通常,您應該盡量避免對帶有多個唯一關鍵字的表使用on duplicate key子句。

從insert...update語句的insert部分引用列值。換句話說,如果沒有發生重複關鍵字衝突,則update子句中的values(col_name)可以引用被插入的col_name的值。本函式特別適用於多行插入。values()函式只在insert...update語句中有意義,其它時候會返回null。

示例:

mysql>insert into table (a,b,c) values (1,2,3),(4,5,6)
->on duplicate key update c=values(a)+values(b);
本語句與以下兩個語句作用相同:

mysql>insert into table (a,b,c) values (1,2,3)
->on duplicate key update c=3;
mysql>insert into table (a,b,c) values (4,5,6)
->on duplicate key update c=9;
當您使用on duplicate key update時,delayed選項被忽略。

第三種:

replace語句

我們在使用資料庫

時可能會經常遇到這種情況。如果乙個表在乙個欄位上建立了唯一索引,當我們再向這個表中使用已經存在的鍵值插入一條記錄,那將會丟擲乙個主鍵衝突的錯誤。當然,我們可能想用新記錄的值來覆蓋原來的記錄值。如果使用傳統的做法,必須先使用delete語句刪除原先的記錄,然後再使用insert插入新的記錄。而在mysql中為我們提供了一種新的解決方案,這就是replace語句。使用replace插入一條記錄時,如果不重複,replace就和insert的功能一樣,如果有重覆記錄,replace就使用新記錄的值來替換原來的記錄值。

使用replace的最大好處就是可以將delete和insert合二為一,形成乙個原子操作。這樣就可以不必考慮在同時使用delete和insert時新增事務等複雜操作了。

在使用replace時,表中必須有唯一索引,而且這個索引所在的字段不能允許空值,否則replace就和insert完全一樣的。

在執行replace後,系統返回了所影響的行數,如果返回1,說明在表中並沒有重複的記錄,如果返回2,說明有一條重覆記錄,系統自動先呼叫了delete刪除這條記錄,然後再記錄用insert來插入這條記錄。如果返回的值大於2,那說明有多個唯一索引,有多條記錄被刪除和插入。

replace的語法和insert非常的相似,如下面的replace語句是插入或更新一條記錄。

replace into users (id,name,age) values(123, '趙本山', 50);

插入多條記錄:

replace into users(id, name, age)

values(123, '趙本山', 50), (134,'mary',15);

replace也可以使用set語句

replace into users set id = 123, name = '趙本山', age = 50;

上面曾提到replace可能影響3條以上的記錄,這是因為在表中有超過乙個的唯一索引。在這種情況下,replace將考慮每乙個唯一索引,並對每乙個索引對應的重覆記錄都刪除,然後插入這條新記錄。假設有乙個table1表,有3個字段a, b, c。它們都有乙個唯一索引。

create table table1(a int not null unique,b int not null unique,c int not null unique);

假設table1中已經有了3條記錄

a b c

1 1 1

2 2 2

3 3 3

下面我們使用replace語句向table1中插入一條記錄。

replace into table1(a, b, c) values(1,2,3);

返回的結果如下

query ok, 4 rows affected (0.00 sec)

在table1中的記錄如下

a b c

1 2 3

我們可以看到,replace將原先的3條記錄都刪除了,然後將(1, 2, 3)插入。

總結:雖然沒有具體測試,感覺第一種最費資源了(只是感覺),不過你要是沒有主鍵的話也只能用他了。

第二種和第三種的區別是:

1)insert是先嘗試插入,若主鍵存在則更新。replace是先嘗試插入,若主鍵存在則刪除原紀錄再插入。

2)如果有多個唯一關鍵字發生衝突(不同關鍵字的衝突發生在不同記錄),比如現在有2個字段2條記錄衝突了(沒條記錄衝突乙個字段),

則insert是選擇排序後在前面的一條進行更新,replace是刪除那兩條記錄,然後插入新記錄。

本人的一點小見解,如有錯誤,歡迎指正。

MySQL 記錄不存在插入 和 存在則更新

想要插入一條資料,要避免重複插入,又不想折騰兩回資料庫連線操作,可以參考如下辦法 語法 此處 aa,bb,cc 為要插入的 a,b,c 列的值 insert into table1 a,b,c select aa,bb,cc from dual where notexists select cfro...

MySQL記錄存在則更新,不存在則插入

create table tb file authorize authorize id int 11 not null auto increment,str id int 11 default null comment 使用者標識 file id int 11 default null commen...

不存在時才插入資料

最近在寫乙個專案,需要批量向資料庫插入資料 批處理 但是遇到乙個問題,如果某條資料已存在 主鍵相同 則全部插入都會失敗。所以,我需要找到乙個方法 如果資料不存在,就插入,否則就忽略。在網上找到一篇文章 文章介紹了兩種方法,第一種略顯複雜,且子查詢的效率也是個問題,而且子查詢中不能用limit 當然也...