簡體   English   中英

MySQL不允許行具有與另一行相同的兩個列值

[英]MySQL disallow row that has 2 identical column values with another row

這是我的MySQL表:

在此處輸入圖片說明

  • 左列自動遞增。
  • 中心列是用戶的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的情況

您需要在user_id和post_id列上設置唯一約束

更新

以下答案可能會導致出現競態條件,並且在某些情況下可能會重復數據庫條目。

感謝@Martin查找以下系統的主要缺陷:


這是您在業務邏輯中應該做的事情。 我實現了幾乎相同的系統的方式是這樣的(用偽代碼):

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

顯示任一按鈕的代碼在服務器上,因此用戶無法攔截該按鈕並手動選擇要執行的操作。

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

通過在服務器上測試用戶是否喜歡,然后僅在用戶不喜歡時才插入,我克服了這一問題。

CREATE UNIQUE INDEX user_post on likes (user_id, post_id)

這樣可以防止相同(user_id,post_id)值超過一次...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM