MYSQL插入重複時的更新方法

2021-12-30 10:19:34 字數 3168 閱讀 6803

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

MySql批量更新方法

準備資料 表 user 使用者 dept 部門 1 更新符合單個條件的某個欄位的一條資料 update user u set u.name 測試 where u.id 2 in 更新多條資料 update user u set u.name 測試 where u.id in 3 符合多個條件更新內容...

TinyOS更新方法

介紹兩種方法 在linux或者cygwin環境下更新 設定環境變數 export cvsroot pserver anonymous tinyos.cvs.sourceforge.net cvsroot tinyos 接入命令 cvs d pserver anonymous tinyos.cvs.s...

軟體更新方法

軟體更新方法 摘要 本發明涉及通訊領域,公開了一種軟體更新方法,使得能夠在一次更新過程中,提供軟體新增功能的無縫銜接和新版本軟體的格式更改,同時使得軟體公升級方法對未來的未知需求有最佳的適應能力,並能提高軟體公升級效率。本發明將要公升級的軟體分為三個部分 新版本軟體包頭部 與軟體公升級相關的部分和其...