2009-11-02 07:00
出處:51cto【
本文的unique列上插入重複值解決方案,主要基於mysql平台。通過這些,可以做到一些新的功能和應用。希望本文能對大家有所幫助。
當unique列在乙個unique鍵上插入包含重複值的記錄時,我們可以控制mysql如何處理這種情況:使用ignore關鍵字或者on duplicate key update子句跳過insert、中斷操作或者更新舊記錄為新值。
mysql> createtable 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 ...