mysql用唯一约束避免重复_mysql中创建唯一约束防止数据重复
針對(duì)數(shù)據(jù)重復(fù)插入的情況,我們通常會(huì)在業(yè)務(wù)代碼中進(jìn)行處理,就是說(shuō)入庫(kù)的時(shí)候先查一遍有沒(méi)有,沒(méi)有記錄的情況再準(zhǔn)許入庫(kù)。但是如果只是自己處理業(yè)務(wù)代碼時(shí)先查后入庫(kù),并發(fā)高時(shí)會(huì)發(fā)生意想不到的后果。
比如現(xiàn)在表tab里有兩個(gè)字段fa, fb。業(yè)務(wù)規(guī)定,fa和fb的值只能成對(duì)出現(xiàn)一次(好比1,2入庫(kù)一次,就不能再有一條1,2的記錄入庫(kù))。
當(dāng)在自己的業(yè)務(wù)代碼里處理避免再次入庫(kù)時(shí),會(huì)這樣處理,
步驟一:select 1 from tab where fa = ? and fb = ?
步驟二:insert tab values (?, ?)
那么問(wèn)題來(lái)了:當(dāng)?shù)谝粭l記錄來(lái)了,比如fa=1, fb=2。此時(shí)他通過(guò)了步驟一的檢測(cè),沒(méi)有這條記錄,于是來(lái)到了步驟二。就在此時(shí),第二條記錄又來(lái)了,而且又是一個(gè)fa=1, fb=2。好吧,第一條記錄可能還沒(méi)入庫(kù)完呢,那第二條記錄也可以通過(guò)了步驟一的檢測(cè),也來(lái)到了步驟二。。而這時(shí),意想不到的事發(fā)生了。有兩條一樣的記錄了。所以這種并發(fā)高了的情況發(fā)生就造成這樣滴局面。
而如果在數(shù)據(jù)庫(kù)層面進(jìn)行限制就會(huì)完美解決這一個(gè)問(wèn)題(當(dāng)然業(yè)務(wù)上有上述需求的話,db做了限制外,最好自己的業(yè)務(wù)代碼也要先查一下,再入庫(kù)。發(fā)生了什么好做處理,比如查詢的時(shí)候發(fā)現(xiàn)已經(jīng)入庫(kù)了,這時(shí)又什么業(yè)務(wù)策略。再有也可以通過(guò)數(shù)據(jù)庫(kù)返回碼,唯一約束時(shí),db會(huì)拋出[Err] 1062的錯(cuò)誤碼)。。
一個(gè)表可以有多個(gè)唯一約束,一個(gè)約束可以只有一列,當(dāng)然也可以有多列。? 添加唯一索引的方法如下:
1
2ALTER TABLE tab ADD CONSTRAINT some_name UNIQUE (fa, fb)
如果在第一次建表時(shí),加約束方法如下:
CREATE TABLE tab ( fa int NOT NULL, fb int NOT NULL, CONSTRAINT some_name UNIQUE (fa ,fb ) )
總結(jié)
以上是生活随笔為你收集整理的mysql用唯一约束避免重复_mysql中创建唯一约束防止数据重复的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java中appletviewer是什么
- 下一篇: centos 7 修复mysql,快速修