1. 程式人生 > >MySql避免"重複插入記錄"的方法(INSERT ignore into,Replace into,ON DUPLICATE KEY UPDATE)

MySql避免"重複插入記錄"的方法(INSERT ignore into,Replace into,ON DUPLICATE KEY UPDATE)

案一:使用ignore關鍵字
如果是用主鍵primary或者唯一索引unique區分了記錄的唯一性,避免重複插入記錄可以使用:
程式碼如下 複製程式碼
1 INSERT IGNORE INTO table_name (email, phone, user_id) VALUES (‘[email protected]’, ‘99999’, ‘9999’);
這樣當有重複記錄就會忽略,執行後返回數字0
還有個應用就是複製表,避免重複記錄:

 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'

再貼一個例子:

 INSERT INTO `class` SELECT * FROM `class1` ON DUPLICATE KEY UPDATE `class`.`course`=`class1`.`course`

其它關鍵:DELAYED 做為快速插入,並不是很關心失效性,提高插入效能。
IGNORE 只關注主鍵對應記錄是不存在,無則新增,有則忽略。

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

 INSERT INTO `test` (`a`) VALUES (NULL);

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

相關推薦

MySql避免重複插入記錄方法(ignore,Replace,ON DUPLICATE KEY UPDATE)

本文章來給大家提供三種在mysql中避免重複插入記錄方法,主要是講到了ignore,Replace,ON DUPLICATE KEY UPDATE三種方法,各位同學可嘗試參考。案一:使用ignore關鍵字如果是用主鍵primary或者唯一索引unique區分了記錄的唯一性,避

MySql避免"重複插入記錄"的方法(INSERT ignore into,Replace into,ON DUPLICATE KEY UPDATE)

案一:使用ignore關鍵字 如果是用主鍵primary或者唯一索引unique區分了記錄的唯一性,避免重複插入記錄可以使用: 程式碼如下 複製程式碼 1 INSERT IGNORE INTO table_name (email, phone, us

MySql避免重複插入記錄(根據主鍵判重)

方案一:使用ignore關鍵字 如果是用主鍵primary或者唯一索引unique區分了記錄的唯一性,避免重複插入記錄可以使用: insert ignore into table_name(email,phone,user_id) values('[email 

MYSQLREPLACEON DUPLICATE KEY UPDATE使用

覆蓋 選項 insert pan ins ima pri details 匹配 REPLACE 我們在使用數據庫時可能會經常遇到這種情況。如果一個表在一個字段上建立了唯一索引,當我們再向這個表中使用已經存在的鍵值插入一條記錄,那將會拋出一個主鍵沖突的錯誤。當然,我們可能想用

MySql-避免重複插入資料-使用者名稱稱唯一登入

答主最近在寫一個程式時需要遇到“使用使用者名稱實現使用者唯一登入”的問題。 如果是要求避免重複插入記錄,可以參考其他文章關於ignore,replace,on duplicate key value 的詳解,答主在這裡就不一一贅述了。這裡要實現使用唯一使用者名稱實現登入驗證可以使用 mysql中的

記錄mysql中的case when|on duplicate key update|重複插入返回主鍵的用法

在平時的開發中不免接觸到資料庫,這裡記錄一些平時開發中遇到的細節問題,與大家共勉。 mysql中的條件控制:case函式 在操作資料庫的開發中不免遇到一些類似if else的判斷,這時候就用到了Case函式,首先我們用網上用了好多次的例子來看看它的用法:

mysql重複插入insert時更新ON DUPLICATE KEY UPDATE

mysql當插入重複時更新的方法: 第一種方法: 示例一:插入多條記錄 假設有一個主鍵為 client_id 的 clients 表,可以使用下面的語句: INSERT INTO clients (client_id,client_name,cl

MYSQL 批量插入資料 insert into ON DUPLICATE KEY UPDATE

#批量插入並根據重複資料進行處理 class DF_MYSQL(DBBase):     #定義操作更新時間相關的方法     #獲取上次更新的時間     def __del__(self):       &

MySQL插入更新重複值】ON DUPLICATE KEY UPDATE用法

要插入的資料  與表中記錄資料的 惟一索引或主鍵中產生重複值,那麼就會發生舊行的更新 弊端:造成主鍵自增不連續。適合資料量不大的表。 ON DUPLICATE KEY UPDATE後面的條件 eg有如下表,僅主鍵存在UK(唯一)屬性: select * from Stude

mysql INSERT ... ON DUPLICATE KEY UPDATE語句

not 股票 目的 一個 lin arc sta int prim 網上關於INSERT ... ON DUPLICATE KEY UPDATE大多數文章都是同一篇文章轉來轉去,首先這個語法的目的是為了解決重復性,當數據庫中存在某個記錄時,執行這條語句會更新它,而不存在這條

ON DUPLICATE KEY UPDATEmysqlINSERT語句中用法

1、如果在INSERT語句後面帶上ON DUPLICATE KEY UPDATE 子句,而要插入的行與表中現有記錄的惟一索引或主鍵中產生重複值,那麼就會發生舊行的更新; 2、如果插入的行資料與現有表中記錄的唯一索引或者主鍵****不重複,則執行新紀錄插入操作。 示例: creat

on duplicate key update 重複插入時更新 使用

基本語法: INSERT INTO TABLE (a,c) VALUES (1,3) ON DUPLICATE KEY UPDATE c=c+1; (這裡a為主鍵) 這條sql相等於兩條sql: 1.INSERT INTO TABLE (a,c) VALUES (1,3) 2.U

Mysql 插入資料存在時執行update操作:ON DUPLICATE KEY UPDATE

-- 建立表:test: CREATE TABLE `test` (   `objId` int(10) NOT NULL,   `orgId` int(10) NOT NULL,   `objName` varchar(50) NOT NULL,   PRIMARY KE

mysqlON DUPLICATE KEY UPDATEINSERT語句中的用法

1、如果在INSERT語句後面帶上ON DUPLICATE KEY UPDATE 子句,而要插入的行與表中現有記錄的惟一索引或主鍵中產生重複值,那麼就會發生舊行的更新; 2、如果插入的行資料與現有表中記

mysql 插入更新判斷 ON DUPLICATE KEY UPDATE

平時我們在設計資料庫表的時候總會設計 unique 或者 給表加上 primary key 的限制條件.此時 插入資料的時候 ,經常會有這樣的情況:我們想向資料庫插入一條記錄: 若資料表中存在以相同主鍵的記錄,我們就更新該條記錄。 否則就插入一條新的記錄。 如果在INSERT語句末尾指定

MySQL】淺析“replace into 操作” 與 “insert into+ON DUPLICATE KEY UPDATE操作”

對有主鍵和唯一鍵的表進行insert into+ON DUPLICATE KEY UPDATE操作(product)[email protected] [test]> CREATE TABLE `student` (    -> `id` int(10) unsigned NOT NUL

MySQL -- INSERT ON DUPLICATE KEY UPDATE 使用

前言:  MySQL 中 INSERT ON DUPLICATE KEY UPDATE 這個方法可能不是很常用,但卻很好用,它主要功能是:當插入的資料中的主鍵 與 資料庫中現有的資料主鍵 重複的情況下就不會執行插入操作,而是可以對現有的資料進行更新操作,不存在相同主鍵則執行插入操作

mysql ON DUPLICATE KEY UPDATE,有則更新,無則插入

1、適合用在需要 判斷記錄是否存在,不存在則插入存在則更新的場景  a 為 主鍵 或 擁有UNIQUE索引 INSERT INTO TABLE (a,c) VALUES (1,3),(1,8) ON DUPLICATE KEY UPDATE c=c+1;----c=4 INSE

mysqlinsert ....on duplicate key update問題

on duplicate key update 這個語句好用是非常好用,可以很只能的幫你實現,如果記錄存在則更新你已經設定過的需要更新的欄位,如果沒有該條記錄就插入該條記錄。     現在講講他的一些問題:       &nb

Mysql replace intoinsert into on duplicate key update 死鎖和效能測試

1   編寫目的 1.  測試 replace into 引發死鎖 2.  測試 replace 和INSET INTO  ***  ON DUPLICATE KEY UPDATE *** 效能差 2   資料庫環境說明 1、 資料庫系統: 名稱:Mysql 5.5.31