CONSTRAINT на уникальные значения с условием

Есть таблица в mysql колонки (id,custom_field_id ,value)

В таблицу необходимо установить ограничение на уникальные значения поля value, при условии что custom_field_id = 7 т.е с при остальныхcustom_field_id значения могут быть не уникальными


Ответы (1 шт):

Автор решения: Мелкий

MySQL на данный момент не умеет частичные индексы.

В MySQL 8.0.13 и новее можно обойти так:

create  table foo (custom_field_id int , value int);
create unique index idx1 on foo(value, (if(custom_field_id = 7, custom_field_id,  null)));

Вычисляемое значение вторым полем будет давать NULL для custom_field_id != 7, NULL не равен NULL, а потому уникальность нарушаться не будет. Для значения 7, в свою очередь же, уникальность будет проверяться по значению value.


В ещё более старых версиях mysql придётся добавлять generated column в таблицу для вычисления выражения if(custom_field_id = 7, custom_field_id, null) и включать в индекс это поле.

create  table foo (
  custom_field_id int , 
  val int, 
  cf7 int as (if(custom_field_id = 7, custom_field_id,  null)) virtual
);
create unique index idx1 on foo(val, cf7);
→ Ссылка