Уникальность значения MySQL

#mysql #key #constraints #unique

#mysql #Клавиша #ограничения #уникальный

Вопрос:

У меня есть таблица, которая содержит столбцы:

 employer_id
contact_id
primary
  

Первые два — это целые числа, последнее — это крошечное число, равное либо 1/0. Работодатель может быть присоединен к нескольким контактам и наоборот. Однако я хочу обеспечить соблюдение того, что может быть только один экземпляр, где primary = 1 для каждого конкретного работодателя. Их может быть много, где primary = 0.

Есть ли какой-либо способ сделать это с помощью ограничений / ключей в MySQL?

Спасибо

Ответ №1:

Не с помощью ключей, но вы можете установить триггер вставки / обновления, чтобы проверить это (count(*) where primary=1 and employer_id=?) <= 1 .

Редактировать: На самом деле, я думаю, что есть способ: вы создаете вторую таблицу с employer_id в качестве первичного ключа и второго поля для его основного контакта. Итак, у вас были бы эти 2 таблицы:

 ===================================   ================================
|          maintable              |   |       maincontacttable       |
===================================   ================================
|employer_id|contact_id|...data...|   |employer_id|primary_contact_id|
|   PK      |    FK    |          |   |    PK FK  |       FK         |
===================================   ================================
  

Больше нет primary столбца. Поскольку employer_id это ключ во второй таблице, у вас может быть не более одной записи.

Вы получаете основной контакт через левое внешнее соединение, и оно возвращает либо основной контакт, либо null .

Комментарии:

1. Хорошо, я знаю, что могу сделать это с помощью триггера … просто надеялся избежать этого. Пока оставляем открытым на случай, если у кого-то есть какое-нибудь невероятно умное решение. Если нет, я просто приму свою судьбу … и ваш ответ. Спасибо.

Ответ №2:

У меня был похожий случай несколько дней назад, и то, что я сделал, это добавил еще один столбец «created_at», таким образом, я могу получить «первичный» (последний вставленный и с primary = 1);