php - mysql不使用索引如何做到不插入重複的資料?
PHP中文网
PHP中文网 2017-05-16 12:58:10
0
2
609

表中有兩個字段,分別是a,b。

例如記錄如下
1,2
1,3
2,3
1,3

說明:
1.其中1,3才是重複的資料。
2.表裡面是允許重複資料存在。

問題:當使用者選擇重複的資料不加入入庫,這時如果使用者新增的資料如下。

2,3
1,4
1,3

只能讓1,4插入,其餘都不可以,怎麼實現這個需求?麻煩了

PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(2)
伊谢尔伦

這個問題比較好解決哈,使用樂觀鎖吧,步驟如下:
1.創建(1,3)元組的的md5 hash key(hashedKey)到redis裡面,第一次查詢時把對應的記錄放到redis裡面去;
2.插入記錄時,先插入新的(1,3)元組的md5 hash key到redis裡面(樂觀鎖機制),如果不能插入,證明已經存在此key,拒絕進行此插入操作;
3.hash演算法範例如下:

function goHashed($a,$b,&$hashedKey)
{
   //注意对a,b数据格式的判断和异常考虑
   const SALT = "Hello,world"
   $hashedKey = md5($a.SALT.$b.SALT)
}

===好好看了一下題主的問題,似乎還必須用MySQL的方式解決===

如果不使用索引,本人還真沒什麼好辦法,不過要是可以建索引的話,可以讓a->b組成一個索引表的一個字段,索引類型為unique index,這樣也能解決重複插入的問題。

为情所困

使用唯一約束的目的是在資料庫層進行重複資料的限制.

這裡如果你要放棄這個限制的話,那麼我們只能透過程序的方式來避免了.

最直接的解決方案就是,在插入資料之前,我們先搜尋資料,判斷下這個需要考慮唯一性的欄位是否已經存在即將更新進去的值.如果存在,則放棄更新,否則執行更新操作.BUT,這個還是不能很號的避免重複數據的錄入,畢竟還是存在那種高並發重複數據錄入的情況. 只能是說大大的降低了重複數據錄入的概率.

建議,能使用唯一約束的情況,還是盡量有唯一約束保證,這畢竟是系統的最後一層保障了.

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板