MySQL禁止具有2个相同列值的行与另一行

时间:2011-04-02 22:21:23

标签: php mysql

这是我的MySQL表:

enter image description here

  • 左列自动递增。
  • 中间列是用户的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

的情况

3 个答案:

答案 0 :(得分:4)

您需要在user_id和post_id列

上设置unique constraint

答案 1 :(得分:1)

更新

以下答案可能会导致Race Conditions,并且在某些情况下可能会重复数据库条目。

感谢@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

显示任一按钮的代码在服务器上,因此用户无法拦截它并手动选择要执行的操作。

唯一的缺陷是必须有一种方法来识别用户点击的按钮,这意味着用户可能花费大量时间挖掘和摆弄,并可能更改页面上的按钮/链接/任何内容。

我通过在服务器上测试用户是否已经喜欢,然后仅在他们没有喜欢时插入来克服这个问题。

答案 2 :(得分:0)

CREATE UNIQUE INDEX user_post on likes (user_id, post_id)

这可以防止多次使用相同的(user_id,post_id)值...