萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> 防止重復插入記錄sql實現方法

防止重復插入記錄sql實現方法

replace語法

replace的語法格式為:

1. replace into table_name(col_name, ...) values(...)

2. replace into table_name(col_name, ...) select ...

3. replace into table_name set col_name=value, ...

算法說明:

replace的運行與insert很相像,但是如果舊記錄與新記錄有相同的值,則在新記錄被插入之前,舊記錄被刪除,即:

1.    嘗試把新行插入到表中

2.    當因為對於主鍵或唯一關鍵字出現重復關鍵字錯誤而造成插入失敗時:

         從表中刪除含有重復關鍵字值的沖突行

        再次嘗試把新行插入到表中

舊記錄與新記錄有相同的值的判斷標准就是:表有一個primary key或unique索引,否則,使用一個replace語句沒有意義。

該語句會與insert相同,因為沒有索引被用於確定是否新行復制了其它的行。

返回值:

not exists

示例一:插入多條記錄
假設有一個主鍵為 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);


on duplicate key update

如‍上所寫,你也可以在insert into.....後面加上 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選項被忽略。

copyright © 萬盛學電腦網 all rights reserved