我有一个列为id
、user_id
、post_id
、like
、views
的表。当用户单击"点赞"按钮时,将向表中添加一行,其中包含相应的user_id
和post_id
,并且like
将设置为1
。如果行已经存在,而like
列已经是1
,则不会发生任何事情。
当用户访问特定页面时,表中将添加一行,其中包含相应的user_id
和post_id
,并且view
将设置为1
。但是,如果该行已经存在,则view
中的值将递增。
问题:我尝试使用INSERT INTO mytable ... ON DUPLICATE KEY UPDATE like = 1
,但表的主键是id
,而不是user_id
或post_id
。如果我将主键设置为user_id
或post_id
,就会出现问题,因为只有当存在具有相同user_id
和post_id
的行时,该行才会重复。
在这种情况下,应该如何构建查询?
或者,更好的情况是将表拆分为两个表,一个用于likes
,一个为views
。如果是这种情况,我仍然需要基于user_id
和post_id
列使行唯一。
还是执行多个SQL查询?
请建议,谢谢!
我建议你有一个点赞表,然后在你保存帖子的任何表中,添加一行视图。因此,每当查看这篇文章时,只需将该文章的视图值更新为view=view+1。
现在,为了解决您概述的关于主键的问题,您应该注意,您可以在该场景中使用唯一的键,它可以应用于多个列,并可以解决您遇到的问题。因此,例如,如果在您的场景中,您有一个包含userid和postid的唯一键,那么您的数据库将不允许该表中的两个不同行具有相同的userid和postid。
因此,为了将来参考,如果需要,请使用唯一的密钥:)
- 放弃id作为主键
- 用两张桌子
- 在(user_id,post_id)上生成主键
- 当处理insert时,执行insert忽略
- 处理插入视图时,执行插入操作。。重复密钥更新视图=视图+1