MYSQL:创建唯一索引,避免在很多条目显示0时出现重复条目

MYSQL: Create a unique index to avoid duplicate entries when many entries show 0

我正在使用一个 table 评论来存储多个主题、歌曲、艺术家和专辑的评论,这些评论来自多个用户。我想找到一种方法来防止一个用户对给定的歌曲、艺术家或专辑进行重复评论。当我尝试在 PHP 中执行此操作时,我希望 MYSQL 在 userid 和 songid 上使用 UNIQUE 索引来强制执行唯一性。

但是,我 运行 遇到了一个问题,即对于不适用的字段,条目显示为 0。例如,如果评论针对的是歌曲 ID,则 table 会显示 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 更改为空。在大多数情况下,null 被认为是彼此不同的(group by 仍然将它们分组在一起)。

假设将它们更改为 null 不会破坏大量其他查询,它可以在单个查询中完成:

UPDATE reviews 
SET songid = NULLIF(songid, 0)
  , albumid = NULLIF(albumid, 0)
  , artistid = NULLIF(artistid, 0)
;

没有表达式索引,但可能有更简单的解决方案。停止使用 0,而是使用 null 表示不适用的值。

nulls 是 SQL 数据库的原生方式,表示缺少值,不参与索引。