1. 程式人生 > >MySQL 處理插入過程中的主鍵唯一鍵重複值辦法

MySQL 處理插入過程中的主鍵唯一鍵重複值辦法

介紹

本篇文章主要介紹在插入資料到表中遇到鍵重複避免插入重複值的處理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE;接下來就分別看看這三種方式的處理辦法。

IGNORE

使用ignore當插入的值遇到主鍵(PRIMARY KEY)或者唯一鍵(UNIQUE KEY)重複時自動忽略重複的記錄行,不影響後面的記錄行的插入,

建立測試表

CREATE  TABLE  Tignore
(ID INT NOT NULL PRIMARY KEY ,
NAME1 INT
)default charset=utf8;

正常的插入如果插入的記錄中存在鍵重複會報錯,整個語句都會執行失敗

使用IGNORE如果插入的記錄中存在重複值會忽略重複值的該記錄行,不影響其它行的插入。

REPLACE

使用replace當插入的記錄遇到主鍵或者唯一鍵重複時先刪除表中重複的記錄行再插入。

REPLACE   INTO Treplace() VALUES(1,1),(1,2),(2,2);

建立測試表

DROP TABLE  IF EXISTS Treplace;
CREATE  TABLE  Treplace
(ID INT NOT NULL PRIMARY KEY ,
NAME1 INT
)default charset=utf8;

 從輸出的資訊可以看到是4行受影響,說明它是先插入了(1,1)然後又刪除了(1,1)

ON DUPLICATE KEY UPDATE

當插入的記錄遇到主鍵或者唯一鍵重複時,會執行後面定義的UPDATE操作。

相當於先執行Insert 操作,再根據主鍵或者唯一鍵執行update操作。

建立測試表

DROP TABLE  IF EXISTS Tupdate;
CREATE  TABLE  Tupdate
(ID INT NOT NULL PRIMARY KEY ,
NAME1 INT UNIQUE KEY
)default charset=utf8;
INSERT INTO Tupdate() VALUES(1,1),(1,2) ON DUPLICATE KEY
UPDATE NAME1=NAME1+1; INSERT INTO Tupdate() VALUES(1,1),(1,2) ON DUPLICATE KEY UPDATE NAME1=VALUES(NAME1)+1;

第一條語句相當於執行:

INSERT INTO Tupdate() VALUES(1,1)
UPDATE Tupdate
SET NAME1=NAME1+1
WHERE ID=1;

第二條語句相當於執行:

INSERT INTO Tupdate() VALUES(1,1)
UPDATE Tupdate
SET NAME1=2+1
WHERE ID=1;

在ON DUPLICATE KEY UPDATE後面使用VALUES指的就是插入的記錄的值,而不使用VALUES指的是表的自身值。

注意: ON DUPLICATE KEY UPDATE的後面執行的UPDATE更新的記錄是WHERE重複的主鍵或者唯一鍵的ID,這點非常重要。

比如下面這種情況:

INSERT INTO Tupdate() VALUES(1,1),(2,1) ON DUPLICATE KEY UPDATE NAME1=VALUES(ID)+1;

它是唯一鍵NAME1重複但是主鍵不重複,執行的語句是這樣的:

INSERT INTO Tupdate() VALUES(1,1)
UPDATE Tupdate
SET NAME1=2+1
WHERE ID=1;

不要認為會插入主鍵ID=2的記錄進去。

總結

 上面的三種處理重複值的方法都支援標準的INSERT語法,包括INSERT INTO...VALUES, INSERT INTO ....SET ,INSERT INTO..... SELECT。

備註:

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結。

《歡迎交流討論》

相關推薦

MySQL 處理插入過程唯一重複辦法

介紹 本篇文章主要介紹在插入資料到表中遇到鍵重複避免插入重複值的處理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE;接下來就分別看看這三種方式的處理辦法。 IGNORE 使用ignore當插入的值遇到主鍵(PRIMARY KEY)或者唯一鍵(UNIQ

MyBatis+MySQL 返回插入記錄的ID

一、nginx基本配置 二、nginx日誌檔案配置 在nginx中conf中的nginx.conf有一段關於日誌檔案的配置 三、製作按時間切割日誌檔案的指令碼 1.製作切割日誌指令碼cutlog.sh 2.使用定時執行命令 (1)crontab -e 進入編輯 (2)輸

Mysql存儲過程的事務回滾

異常 procedure mysq span val com cnblogs 事務 erro create procedure test(in a int) BEGIN DECLARE t_error INTEGER DEFAULT 0;

mysql 存儲過程使用遊標使用臨時表可以替代數組效果

效果 tmp declare ges 必須 eight bold lar ora mysql不支持數組。但有時候需要組合幾張表的數據,在存儲過程中,經過比較復雜的運算獲取結果直接輸出給調用方,比如符合條件的幾張表的某些字段的組合計算,mysql臨時表可以解決這個問題.臨時表

mysql安轉過程出現的問題! Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exis

fatal 啟動失敗 ini error pri -- http class sql net start mysql啟動失敗,報錯信息如上,因缺少mysql這個庫 所以跳過 在my.ini中添加 --skip-grant-tables 再啟動mysql 然後進

mysql/mariadb學習過程出現的問題與解決

AR 數據 files l數據庫 pre .com 單個 primary cti mysql> insert into student values(162111,‘周帥‘,‘男‘,21,‘CS‘); ERROR 1062 (23000): Duplicate en

mysql存儲過程in、out、inout參數使用

mysql 存儲過程in 代表輸入,意思說你的參數要傳到存過過程的過程裏面去。基本可以理解為傳入function的參數,而如果該參數是個變量,那麽整個procedure過程結束後,不會影響外部的變量值。 /案例功能:求1-n的和開發者:徐守威時間:2016-08-13/delimiter $create pr

mysql 存儲過程結尾分割符修改

iter del lec 過程 from mce 就是 rom 執行命令 mysql中修改命令結束符delimiter的用法:mysql中的delimiter會告訴MySQL解釋器,命令的結束符是什麽,默認情況下MySQL的命令是以分號(;)結束的.在遇到(;)時,MySQ

VS2017 + EF + MySQL 我使用過程遇到的坑

help 打開 http mysql 產生 www. 上下 margin 版本 寫在前面:   第一次使用MySQL連接VS的時候本著最新版的應該就是最好的,在MySQL官網下載了最新版的MySQL沒有並且安裝完成之後,使用MySQLHelper連接MySQL數據庫也是正常

Mysql資料庫安裝過程忘記密碼

1.按照如下連結安裝mysql資料庫:http://www.jb51.net/article/134181.htm mysql 5.7.21 winx64安裝配置方法圖文教程 1、將下載好的mysql壓縮包解壓到安裝目錄下 2、新建檔案  my.ini,放置到mysql

資料庫 外來 唯一區別

下面我通過一個小栗子來說明我們應該如何選擇主鍵,外來鍵和唯一鍵。  現在我們想建立學生表,用來儲存,一個系統的登陸資訊。建表如下: create table student4 (   stu_id int primary key identity,--identity表示自

springmvc在處理請求過程中出現異常資訊交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。為了區別不同的異常通常根據異常型別自定義異常類,這裡我們建立一個自定義系統異常,如果controller、service、dao丟擲此類異常說明是系統預期處理的異常資訊。

springmvc在處理請求過程中出現異常資訊交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。 1.1 異常處理思路 系統中異常包括兩類:預期異常和執行時異常RuntimeException,前者通過捕獲異常從而獲取異常資訊,後者主要通過規範程式碼開發、測試通過手段減少執

springmvc在處理請求過程中出現異常信息交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。為了區別不同的異常通常根據異常類型自定義異常類,這裏我們創建一個自定義系統異常,如果controller、service、dao拋出此類異常說明是系統預期處理的異常信息。

ansi req -type this spring 進行 name ext code springmvc在處理請求過程中出現異常信息交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。 1.1 異常處理思路 系統中異常包括兩類:預期異常和運行時異常Ru

在安裝mysql資料庫的過程,顯示msvcp100.dll丟失?則麼辦?

方案一:重灌作業系統為windows10專業版 方案二:問題: 解答: 報錯原因是VC執行庫不全或者沒有安裝導致,百度搜索VC集合下載安裝, 連結:https://pan.baidu.com/s/1UqKZ0Jx2GqQFvRW9JzM0Rg 提取碼:rijq   初始化後,安

如何在MySQL的儲存過程書寫批量的使用者許可權/授權語句

網上單獨關於MySQL使用者許可權或者儲存過程的文章有不少,但是關於在儲存過程中如何書寫使用者授權語句,尤其是批量授權的資料卻很少。 為什麼筆者會遇到在儲存過程中書寫批量使用者授權語句的需求,是因為筆者在日常開發中承擔了一部分簡單的運維職責(筆者還是很贊同開發兼運維的思想)

命令列下mysql資料庫插入記錄包含中文1366錯誤問題解決方法及其他

出於方便國際化考慮,我把java開發環境和資料庫及表的編碼設定都設定成了utf8。這樣的設定在eclipse環境中向mysql存取資料時沒遇到問題。 但今天在使用命令列向mysql插入中文資料時遇到了1366錯誤。google到以下答案: mysql#1366錯誤是在my

mysql在儲存過程字串轉換數字

公司的需求,需要根據使用者的設定的百分比去查詢資料。當時純真的以為可以 -- set @a_value=`CONVERT`(@a_value,DOUBLE); 但是會出現錯誤,百度了一下,原來convert不支援轉化為double 只能轉換以下型別 二進位制,同帶binar

mysql在儲存過程從結果集給多個引數賦辦法

DECLARE var1 DATETIME; DECLARE var2 DATETIME; SELECT    t.f1, t.f2  into var1,var2 FROM    tableName t ; SELECT     class_id1,     atten

安裝解壓版本的MySQL,安裝過程的常見命令,檢查windows系統錯誤日誌的方式來檢查MySQL啟動錯誤,關於Fatal error: Can't open and lock privilege

安裝mysql下載mysql-5.6.26-winx64,並解壓到:D:\Installed\mysql-5.6.26-winx64\mysql-5.6.26-winx64建立data目錄建立my.in

關於MySql在除錯過程出現Driver not loaded Driver not loaded的問題的解決辦法

問題描述: 在除錯QT程式的時候出現以下圖中所示問題,由QString str = db.lastError().text().toLocal8Bit(); 得到。導致資料庫一直連線不上。 解決方案