2011-04-02 20 views
0

這是我的MySQL表:

enter image description hereMySQL的不允許排有2個相同的列值與另一行

  • 左欄自動遞增。
  • 中心列是用戶的ID號。
  • 右欄是他們喜歡的帖子的ID號。

我將數據插入到表像這樣:

$stmt = $db->prepare("INSERT INTO likes (user_id,post_id) VALUES (?,?)"); 
$stmt->execute(array($_SESSION['user'],$_POST['id'])); 

這工作得很好,但你可以看到MySQL表有兩個相同的行(ID的3 & 4)都有一個USER_ID爲5,post_id爲196.換言之,我的MySQL表記錄了id = 5的用戶喜歡id = 196 兩次。我怎麼禁止在有有兩行的情況相同USER_ID的相同POST_ID的

+1

你需要自動遞增'id'列嗎?我只是在'user_id,post_id'上有一個複合PK# – 2011-04-02 22:24:16

+0

@Minin @inquisitive當你不需要一個ID列時,很少有這種情況,這肯定不是那種情況。 [看到這個問題和答案](http://stackoverflow.com/questions/5496008/when-we-dont-need-a-primary-key-for-our-table/5496048#5496048) – rockerest 2011-04-02 22:29:38

+0

@rockerest - 你似乎將'PK'與'Id'列混淆。它們不是同一件事。我建議OP在2列上有一個複合主鍵。 – 2011-04-02 22:32:48

回答

4

您需要設置的USER_ID和POST_ID列

+0

這是**錯誤**。 UNIQUE約束只會讓用戶「喜歡」一件事。 EVER。不要這樣做。 – rockerest 2011-04-02 22:30:49

+0

@rockerest - 完全不對。唯一的約束[可以在多列](http://stackoverflow.com/questions/2504007/mysql-unique-constraint-on-multiple-fields)。 – 2011-04-02 22:35:25

+0

我的意思是橫跨兩列。其實你可能需要一個索引 - 請參閱http://stackoverflow.com/questions/635937/how-do-i-specify-unique-constraint-for-multiple-columns-in-mysql – 2011-04-02 22:35:51

0
CREATE UNIQUE INDEX user_post on likes (user_id, post_id) 

這防止具有相同的一個unique constraint( USER_ID,POST_ID)值超過一次......

1

更新

下面的答案可能會導致Race Conditions和possib在某些情況下,重複數據庫條目。

感謝@馬丁尋找在下面的系統的主要缺陷:


這是你應該在業務邏輯做。我已經實現幾乎相同的系統中的方法是這樣(在僞代碼):

Show Blog/Video/Post/Etc. 

Has user "liked" this? 
    Yes = show "unlike" button (on server, not JS) 
    No = show "like" button (on server, not JS) 

Add or delete "like" as necessary 

的代碼來顯示任一按鈕在服務器上,所以用戶不能截獲它,並手動選擇哪一個做。

唯一的缺陷是必須有一種方法來識別用戶點擊哪個按鈕,這意味着用戶可能花費大量時間挖掘和擺弄,並可能改變頁面上的按鈕/鏈接/任何內容。

我通過在服務器上測試用戶是否已經喜歡,然後只在他們沒有時才插入來克服這一點。

+1

應該在數據庫中執行唯一約束。任何地方你會得到競賽條件和重複。 – 2011-04-02 22:39:51

+0

@馬丁,你能解釋一下嗎?我不清楚你在這種情況下如何獲得競賽條件或重複。 – rockerest 2011-04-02 22:40:58

+0

如果我向您的服務器提交多個請求,那麼2個併發事務可以檢查行的存在,找到它不存在,然後繼續執行插入操作。由於查詢優化器可以使用這些知識來制定更高效的查詢計劃,因此在數據庫中有獨特的約束條件也是一件好事。 – 2011-04-02 22:50:06

相關問題