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)
;
mysql 没有表达式索引,但可能有更简单的解决方案。停止使用 0,而是使用 null
表示不适用的值。
null
s 是 SQL 数据库的原生方式,表示缺少值,不参与索引。
我正在使用一个 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)
;
mysql 没有表达式索引,但可能有更简单的解决方案。停止使用 0,而是使用 null
表示不适用的值。
null
s 是 SQL 数据库的原生方式,表示缺少值,不参与索引。