mysql 當記錄不存在時插入,當記錄存在時更新
網上基本有三種解決方法。
第一種:
示例一:插入多條記錄
假設有乙個主鍵為 client_id 的 clients 表,可以使用下面的語句:
insert into clients
(client_id, client_name, client_type)
select supplier_id, supplier_name, 'advertising'
from suppliers
where not exists (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 not exists (select * from clients
where clients.client_id = 10345);
使用 dual 做表名可以讓你在 select 語句後面直接跟上要插入欄位的值,即使這些值還不存在當前表中。
第二種:
insert 中 on duplicate key update的使用
如果您指定了on duplicate key update,並且插入行後會導致在乙個unique索引或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子句。
您可以在update子句中使用values(col_name)函式從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避免重複插入記錄方法
本文章來給大家提供三種在mysql中避免重複插入記錄方法,主要是講到了ignore,replace,on duplicate key update三種方法,各位同學可嘗試參考。案一 使用ignore關鍵字 如果是用主鍵primary或者唯一索引unique區分了記錄的唯一性,避免重複插入記錄可以使用...
Mysql避免重複插入記錄
可使用ignore關鍵字 如果有用主鍵primary key或者唯一索引unique區分了記錄的唯一性,當我們無意插入相同資料的時候 主鍵值或是唯一索引值重複 insert into table name email,phone,user id values test 163.com 99999 9...
mysql避免重複插入記錄
1.ignore,如果遇到新插入的資料中與原有資料有唯一鍵衝突,會忽略操作,返回0 insert ignore into table name email phone user id values test9 163.com 99999 9999 2.replace,如果有衝突,會進行兩個操作 刪除...