MYSQL: создайте уникальный индекс, чтобы избежать дублирования записей, когда многие записи показывают 0

Я использую одну таблицу, обзоры, для хранения обзоров по нескольким темам, песням, исполнителям и альбомам, и обзоры поступают от нескольких пользователей. Я хотел бы найти способ предотвратить дублирование отзывов от одного пользователя для данной песни, исполнителя или альбома. Пока я пытаюсь сделать это в PHP, я бы хотел, чтобы MYSQL обеспечивала уникальность, используя индекс UNIQUE для идентификатора пользователя и идентификатора песни.

Однако я столкнулся с проблемой, что записи показывают 0 для неприменимых полей. Например, если обзор посвящен идентификатору песни, в таблице отображается 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

Может ли кто-нибудь предложить способ создания уникального индекса, который каким-то образом решает эту проблему?

Спасибо за любые предложения.


person user6631314    schedule 19.06.2018    source источник


Ответы (2)


Единственный способ использовать уникальные индексы - это изменить все эти 0 на нуль. В большинстве случаев нули считаются отличными друг от друга (group by по-прежнему группирует их вместе).

Предполагая, что изменение их на нули не сломает множество других запросов, это можно выполнить в одном запросе:

UPDATE reviews 
SET songid = NULLIF(songid, 0)
  , albumid = NULLIF(albumid, 0)
  , artistid = NULLIF(artistid, 0)
;
person Uueerdo    schedule 19.06.2018

mysql не имеет индексов выражений, но может быть более простым решением. Прекратите использовать 0 и вместо этого используйте null для неприменимых значений.

null - это собственный способ баз данных SQL для обозначения отсутствия значения и не участвует в индексах.

person Mureinik    schedule 19.06.2018