表中有兩個字段,分別是a,b。
例如記錄如下
1,2
1,3
2,3
1,3
說明:
1.其中1,3才是重複的資料。
2.表裡面是允許重複資料存在。
問題:當使用者選擇重複的資料不加入入庫,這時如果使用者新增的資料如下。
2,3
1,4
1,3
只能讓1,4插入,其餘都不可以,怎麼實現這個需求?麻煩了
伊谢尔伦2017-05-16 13:00:10
這個問題比較好解決哈,使用樂觀鎖吧,步驟如下:
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,這樣也能解決重複插入的問題。
为情所困2017-05-16 13:00:10
使用唯一約束的目的是在資料庫層進行重複資料的限制.
這裡如果你要放棄這個限制的話,那麼我們只能透過程序的方式來避免了.
最直接的解決方案就是,在插入資料之前,我們先搜尋資料,判斷下這個需要考慮唯一性的欄位是否已經存在即將更新進去的值.如果存在,則放棄更新,否則執行更新操作.BUT,這個還是不能很號的避免重複數據的錄入,畢竟還是存在那種高並發重複數據錄入的情況. 只能是說大大的降低了重複數據錄入的概率.
建議,能使用唯一約束的情況,還是盡量有唯一約束保證,這畢竟是系統的最後一層保障了.