mysql 重複插入數值的問題

2021-09-01 01:50:48 字數 3804 閱讀 1083

2009-11-02 07:00

出處:51cto【

本文的unique列上插入重複值解決方案,主要基於mysql平台。通過這些,可以做到一些新的功能和應用。希望本文能對大家有所幫助。

當unique列在乙個unique鍵上插入包含重複值的記錄時,我們可以控制mysql如何處理這種情況:使用ignore關鍵字或者on duplicate key update子句跳過insert、中斷操作或者更新舊記錄為新值。

mysql> create

table menus(id tinyint(4) not

null auto_increment,  

-> label varchar(10) null,url varchar(20) null,unique

key(id));  

query ok, 0 rows affected (0.13 sec)  

mysql> insert

into menus(label,url) values('home','home.html');  

query ok, 1 row affected (0.06 sec)  

mysql> insert

into menus(label,url) values('about us','aboutus.html');  

query ok, 1 row affected (0.05 sec)  

mysql> insert

into menus(label,url) values('services','services.html');  

query ok, 1 row affected (0.05 sec)  

mysql> insert

into menus(label,url) values('feedback','feedback.html');  

query ok, 1 row affected (0.05 sec) 

mysql>select*frommenus;  

+----+----------+---------------+

| id | label   | url          |  

+----+----------+---------------+

| 1 | home    | home.html    |  

| 2 | about us | aboutus.html |  

| 3 | services | services.html |  

| 4 | feedback | feedback.html |  

+----+----------+---------------+

4rows

inset(0.00 sec) 

如果現在在unique列插入一條違背唯一約束的記錄,mysql會中斷操作,提示出錯:

mysql>insert

intomenus(id,label,url)values(4,'contact us'

,'contactus.html'

);  

error 1062 (23000): duplicate entry '4'

for

key

'id'

在前面的insert語句新增ignore關鍵字時,如果認為語句違背了唯一約束,mysql甚至不會嘗試去執行這條語句,因此,下面的語句不會返回錯誤:

mysql>insert

ignore

intomenus(id,label,url)values(4,'contact us'

,'contactus.html'

);  

query ok, 0rowsaffected (0.00 sec)  

mysql>select*frommenus;  

+----+----------+---------------+

| id | label   | url          |  

+----+----------+---------------+

| 1 | home    | home.html    |  

| 2 | about us | aboutus.html |  

| 3 | services | services.html |  

| 4 | feedback | feedback.html |  

+----+----------+---------------+

4rows

inset(0.00 sec) 

當有很多的insert語句需要被順序地執行時,ignore關鍵字就使操作變得很方便。使用它可以保證不管哪乙個insert包含了重複的鍵值,mysql都回跳過它(而不是放棄全部操作)。

在這種情況下,我們還可以通過新增mysql4.1新增加的on duplicate key update子句,使mysql自動把insert操作轉換為update操作。這個子句必須具有需要更新的字段列表,這個列表和update語句使用的列表相同。

mysql>insert

intomenus(id,label,url)values(4,'contact us'

,'contactus.html'

)  

->onduplicatekey

updatelabel='contact us'

,url='contactus.html'

;  

query ok, 2rowsaffected (0.05 sec) 

在這種情況下,如果mysql發現表已經包含具有相同唯一鍵的記錄,它會自動更新舊的記錄為on duplicate key update從句中指定的新值:

mysql>select*frommenus;  

+----+------------+----------------+

| id | label     | url           |  

+----+------------+----------------+

| 1 | home      | home.html     |  

| 2 | about us  | aboutus.html  |  

| 3 | services  | services.html |  

| 4 | contact us | contactus.html |  

+----+------------+----------------+

4rows

inset(0.01 sec) 

mysql插入防重複

普遍解決方法,要麼靠資料庫sql,要麼就是靠程式控制,新增分布式鎖,當然資料庫事務也需要配合使用 1 程式方面,新增version redis 或者資料庫冗餘表 2 資料庫方面 a 插入時新增exist判斷,比如 insert into test name select 4 from dual wh...

ng repeat迴圈數值重複問題

這裡寫乙個angular.js 裡遇見的乙個小問題,當做筆記吧 之前做echarts 雷達圖中要做打分功能 左邊打分項要讀出來 中間數值 右邊 是雷達圖 這樣打分時候是沒問題的 但是檢視打分詳情 ng repeat 就出現了小問題 當我迴圈陣列不同時顯示的沒錯,後來再測一組資料想同時候就報錯了。然後...

mysql 計算非重複 MySQL 不重複插入

sql unique 約束 unique 約束唯一標識資料庫表中的每條記錄。unique 和 primary key 約束均為列或列集合提供了唯一性的保證。primary key 擁有自動定義的 unique 約束。請注意,每個表可以有多個 unique 約束,但是每個表只能有乙個 primary ...