Составной ключ MySQL для разрешения одной записи по умолчанию

У меня есть такая таблица:

ID  UserID  Country IsDefault
1   7       90      0
2   7       93      0
3   7       95      1
4   7       88      0 

5   8       34      0
6   8       55      1
7   8       27      0
8   8       12      0

Идентификатор является первичным ключом. UserID берется из таблицы пользователей. CountryID берется из таблицы стран. IsDefault показывает, какая из стран является страной по умолчанию для пользователя.

Можно ли разрешить только один isDefault = 1 для UserId с использованием составного ключа? т.е. комбинация UserId = 7 должна иметь только один экземпляр с IsDefault = 1. Все остальные экземпляры UserId 7 должны иметь isDefault 0. То же самое касается UserId 8, у которого должна быть только одна страна по умолчанию.


person Raouf Athar    schedule 03.07.2014    source источник
comment
возможно, использовать триггер?   -  person Fabricator    schedule 03.07.2014
comment
Почему бы просто не указать страну по умолчанию в качестве поля в таблице пользователей?   -  person wils484    schedule 03.07.2014
comment
Вы, ребята, правы. Но мне было любопытно, можно ли добавить такое ограничение.   -  person Raouf Athar    schedule 03.07.2014


Ответы (1)


То, что вы ищете, называется частичным индексом (отфильтрованный индекс на сервере SQL), однако MySQL не поддерживает их, т.е. следующее в другой БД (это НЕ будет работать в MySQL )

CREATE UNIQUE INDEX yourIndexNameHere
ON yourTableNameHere (UserID) 
WHERE IsDefault=1;

Ваши варианты следующие

  1. Создайте триггер для выполнения перед операторами INSERT и UPDATE, которые могут обрабатывать ваше уникальное ограничение, т. е. установив IsDefault в 0 для всех других строк для этого UserID (это можно оптимизировать, т. е. игнорировать текущую обновляемую строку в UPDATE и обновлять только там, где IsDefault на самом деле 1) (как предложил Fabricator)
  2. Добавьте столбец DefaultCountry в таблицу пользователей, в которой хранится эта информация (как предложено wils484).
  3. Используйте базу данных, отличную от MySQL. SQL Server, PostgreSQL и SQLite могут поддерживать частичные индексы.
person Simon at My School Portal    schedule 03.07.2014