Php MySQL不允许与另一行具有2个相同列值的行
这是我的MySQL表:Php MySQL不允许与另一行具有2个相同列值的行,php,mysql,Php,Mysql,这是我的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),这两个行的用户id都是5,p
- 左列自动递增李>
- 中间一列是用户的id
- 右栏是他们喜欢的帖子的id
$stmt = $db->prepare("INSERT INTO likes (user_id,post_id) VALUES (?,?)");
$stmt->execute(array($_SESSION['user'],$_POST['id']));
这很好,但是正如您所看到的,MySQL表有两个相同的行(id为3和4),这两个行的用户id都是5,post id都是196。换句话说,我的MySQL表记录了id=5的用户两次喜欢id=196的帖子。我如何禁止两行具有相同的用户id和相同的帖子id您需要在用户id和帖子id列上设置a您需要在用户id上设置a和post_id列
CREATE UNIQUE INDEX user_post on likes (user_id, post_id)
这将防止多次使用相同的(用户id、发布id)值
这将防止多次使用相同的(用户id、发布id)值…Update
在某些情况下,下面的答案可能会导致数据库条目重复
感谢@Martin发现以下系统中的主要缺陷:
这是您在业务逻辑中应该做的事情。我实现几乎相同系统的方式如下(在psuedo代码中): 显示任一按钮的代码都在服务器上,因此用户无法截取该按钮并手动选择要执行的操作 唯一的缺陷是,必须有一种方法来识别用户单击的按钮,这意味着用户可能会花费大量时间挖掘和篡改,并可能更改页面上的按钮/链接/任何内容 我通过在服务器上测试用户是否已经喜欢,然后仅在他们不喜欢时插入来克服这一问题。Update 在某些情况下,下面的答案可能会导致数据库条目重复 感谢@Martin发现以下系统中的主要缺陷:
这是您在业务逻辑中应该做的事情。我实现几乎相同系统的方式如下(在psuedo代码中): 显示任一按钮的代码都在服务器上,因此用户无法截取该按钮并手动选择要执行的操作 唯一的缺陷是,必须有一种方法来识别用户单击的按钮,这意味着用户可能会花费大量时间挖掘和篡改,并可能更改页面上的按钮/链接/任何内容
我通过在服务器上测试用户是否已经喜欢,然后仅在他们不喜欢时插入来克服这一问题。是否需要自动递增
id
列?我会在user\u id,post\u id
@Martin@inquisitive上有一个复合PK,很少有不需要id列的情况,这肯定不是那种情况@rockerest-您似乎把PK
与Id
列混淆了。它们不是一回事。我建议OP在两列上有一个复合主键。@martin,很明显,id
是他的PK
@rockerest,但还不清楚id
列是否有任何有用的用途(我怀疑它没有)。我建议放弃它,在超过2列上创建一个复合主键。您需要自动递增的id
列吗?我会在user\u id,post\u id
@Martin@inquisitive上有一个复合PK,很少有不需要id列的情况,这肯定不是那种情况@rockerest-您似乎把PK
与Id
列混淆了。它们不是一回事。我建议OP在两列上有一个复合主键。@martin,很明显,id
是他的PK
@rockerest,但还不清楚id
列是否有任何有用的用途(我怀疑它没有)。我建议放弃它,在超过2列上创建一个复合主键。这是错误的。唯一约束只允许用户“喜欢”一件事。曾经不要这样做。@rockerest-一点也不正确。唯一的约束。我的意思是跨越两列。事实上,你可能需要一个索引-见优秀,谢谢。我刚开始工作。。。我有点慢,这是错误的。唯一约束只允许用户“喜欢”一件事。曾经不要这样做。@rockerest-一点也不正确。唯一的约束。我的意思是跨越两列。事实上,你可能需要一个索引-见优秀,谢谢。我刚开始工作。。。我有点慢。强制执行唯一约束应该在数据库中完成。“在其他任何地方你都可以得到比赛条件和副本。”马丁,你能解释一下吗?我不清楚在这种情况下,您如何获得竞争条件或重复项。如果我向您的服务器提交多个请求,那么两个并发事务都可以检查行的存在,找到不存在的行并继续执行插入。在数据库中具有唯一约束也是一件好事,因为查询优化人员可以利用这些知识制定更有效的查询计划。应在数据库中执行唯一约束。“在其他任何地方你都可以得到比赛条件和副本。”马丁,你能解释一下吗?我不清楚在这种情况下,您如何获得竞争条件或重复项。如果我向您的服务器提交多个请求,那么两个并发事务都可以检查行的存在,找到不存在的行并继续执行插入。在数据库中具有唯一的约束也是一件好事,因为查询优化人员可以使用这些知识来制定更有效的查询计划。
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