MySql避免重複插入記錄方法

2021-07-11 15:34:30 字數 3765 閱讀 9059

本文章來給大家提供三種在mysql中避免重複插入記錄方法,主要是講到了ignore,replace,on duplicate key update三種方法,各位同學可嘗試參考。

案一:使用ignore關鍵字

如果是用主鍵primary或者唯一索引unique區分了記錄的唯一性,避免重複插入記錄可以使用:

**如下

複製**

1 insert ignore into `table_name` (`email`, `phone`, `user_id`) values ('[email protected]', '99999', '9999');

這樣當有重覆記錄就會忽略,執行後返回數字0

還有個應用就是複製表,避免重覆記錄:

**如下

複製**

1 insert ignore into `table_1` (`name`) select `name` from `table_2`;

方案二:使用replace

語法格式:

**如下

複製**

replace into `table_name`(`col_name`, ...) values (...);

replace into `table_name` (`col_name`, ...) select ...;

replace into `table_name` set `col_name`='value',

...演算法說明:

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

嘗試把新行插入到表中 

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

從表中刪除含有重複關鍵字值的衝突行 

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

舊記錄與新記錄有相同的值的判斷標準就是:

表有乙個primary key或unique索引,否則,使用乙個replace語句沒有意義。該語句會與insert相同,因為沒有索引被用於確定是否新行複製了其它的行。

返回值:

replace語句會返回乙個數,來指示受影響的行的數目。該數是被刪除和被插入的行數的和

受影響的行數可以容易地確定是否replace只新增了一行,或者是否replace也替換了其它行:檢查該數是否為1(新增)或更大(替換)。

示例:# eg:(phone欄位為唯一索引)

**如下

複製**

replace into `table_name` (`email`, `phone`, `user_id`) values ('test569', '99999', '123');

另外,在 sql server 中可以這樣處理:

**如下

複製**

if not exists (select phone from t where phone= '1')   insert into t(phone, update_time) values('1', getdate()) else    update t set update_time = getdate() where phone= '1'

更多資訊請看:

方案三:on duplicate key update

如‍上所寫,你也可以在insert into…..後面加上 on duplicate key update方法來實現。如果您指定了on duplicate key update,並且插入行後會導致在乙個unique索引或primary key中出現重複值,則執行舊行update。

例如,如果列a被定義為unique,並且包含值1,則以下兩個語句具有相同的效果:

**如下

複製**

insert into `table` (`a`, `b`, `c`) values (1, 2, 3) on duplicate key update `c`=`c`+1; 

update `table` set `c`=`c`+1 where `a`=1;

如果行作為新記錄被插入,則受影響行的值為1;如果原有的記錄被更新,則受影響行的值為2。

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

**如下

複製**

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。

**如下

複製**

insert into `table` (`a`, `b`, `c`) values (1, 2, 3), (4, 5, 6) on duplicate key update `c`=values(`a`)+values(`b`);

本語句與以下兩個語句作用相同:

**如下

複製**

insert into `table` (`a`, `b`, `c`) values (1, 2, 3) on duplicate key update `c`=3; 

insert into `table` (`a`, `b`, `c`) values (4, 5, 6) on duplicate key update c=9;

注釋:當您使用on duplicate key update時,delayed選項被忽略。

示例:這個例子是我在實際專案中用到的:是將乙個表的資料匯入到另外乙個表中,資料的重複性就得考慮(如下),唯一索引為:email:

**如下

複製**

insert into `table_name1` (`title`, `first_name`, `last_name`, `email`, `phone`, `user_id`, `role_id`, `status`, `campaign_id`) 

select '', '', '', `table_name2`.`email`, `table_name2`.`phone`, null, null, 'pending', 29 from `table_name2` 

where `table_name2`.`status` = 1 

on duplicate key update `table_name1`.`status`='pending'

再貼乙個例子:

**如下

複製**

1 insert into `class` select * from `class1` on duplicate key update `class`.`course`=`class1`.`course`

其它關鍵:delayed  做為快速插入,並不是很關心失效性,提高插入效能。 

ignore  只關注主鍵對應記錄是不存在,無則新增,有則忽略。

更多資訊請看: 

特別說明:在mysql中unique索引將會對null欄位失效,也就是說(a欄位上建立唯一索引):

**如下

複製**

1 insert into `test` (`a`) values (null);

是可以重複插入的(聯合唯一索引也一樣)。

MySQL避免重複插入記錄方法總結

mysql 當記錄不存在時插入,當記錄存在時更新 網上基本有三種解決方法。第一種 示例一 插入多條記錄 假設有乙個主鍵為 client id 的 clients 表,可以使用下面的語句 insert into clients client id,client name,client type sel...

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,如果有衝突,會進行兩個操作 刪除...