我正在使用一张桌子,评论来存储多个主题,歌曲,艺术家和专辑的评论,而评论来自多个用户。我想找到一种方法来防止某个用户对给定的歌曲,艺术家或专辑重复评论。当我尝试在PHP中执行此操作时,我希望MYSQL使用对userid和songid的UNIQUE索引来强制唯一性。
但是,我遇到了一个问题,即对于不适用的字段,条目显示0。例如,如果评论是针对一个歌曲ID,则表格中的Artistid和Albumid显示为0。
Reviews
reviewid (primary key)|text|songid|albumid|artistid|userid
1|great song|222|0|0|22
2|great album|0|333|0|22
3|great singer|0|0|444|22
//I want to exclude the following entry:
4|lousy song|222|0|0|22
有人可以建议一种创建可以解决该问题的唯一索引的方法吗?
谢谢您的建议。
答案 0 :(得分:1)
使用唯一索引的唯一方法是将所有这些0都更改为null。在大多数情况下,null被认为是彼此不同的(将它们仍然分组在一起)。
假设将它们更改为null不会破坏大量其他查询,可以在单个查询中完成:
UPDATE reviews
SET songid = NULLIF(songid, 0)
, albumid = NULLIF(albumid, 0)
, artistid = NULLIF(artistid, 0)
;
答案 1 :(得分:0)
mysql没有表达式索引,但是可能有一个更简单的解决方案。停止使用0,而对不适用的值使用null
。
null
是SQL数据库的本机方式,用于表示缺少值并且不参与索引。