首頁  >  問答  >  主體

php - mysql不使用索引如何做到不插入重複的資料?

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

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

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

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

2,3
1,4
1,3

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

PHP中文网PHP中文网2737 天前593

全部回覆(2)我來回復

  • 伊谢尔伦

    伊谢尔伦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,這樣也能解決重複插入的問題。

    回覆
    0
  • 为情所困

    为情所困2017-05-16 13:00:10

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

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

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

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

    回覆
    0
  • 取消回覆