代码之家  ›  专栏  ›  技术社区  ›  user6631314

mysql:创建一个唯一的索引,以避免在许多条目显示0时出现重复条目

  •  1
  • user6631314  · 技术社区  · 6 年前

    我使用一个表reviews来存储多个主题、歌曲、艺术家和专辑的评论,这些评论来自多个用户。我想找到一种方法,以防止一个用户对给定的歌曲,艺术家或专辑重复评论。当我试图在php中实现这一点时,我希望mysql在userid和songid上使用一个惟一的索引来实现惟一性。

    但是,我遇到了一个问题:对于不适用的字段,条目显示0。例如,如果评论是针对一个songid的,那么该表显示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
    

    有没有人能提出一种方法来创建一个独特的索引来解决这个问题?

    谢谢你的建议。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Uueerdo    6 年前

    唯一可以使用唯一索引的方法是将所有这些0更改为空。在大多数情况下,零被认为是彼此不同的(仍然将它们分组在一起)。

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

    UPDATE reviews 
    SET songid = NULLIF(songid, 0)
      , albumid = NULLIF(albumid, 0)
      , artistid = NULLIF(artistid, 0)
    ;
    
        2
  •  0
  •   Mureinik    6 年前

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

    无效的 s是sql数据库表示缺少值且不参与索引的原生方式。