Условие MySQL UNIQUE Constraint для нескольких столбцов

Ну, у меня есть таблица с 4 столбцами (id, event_id, group_id, isbn), где id – ПК, event_id и group_id – FK, и моя проблема:

Мне нужно, чтобы номер isbn был уникальным для каждого event_id, позвольте мне привести несколько примеров некоторых строк, которые должны быть возможны, а некоторые — нет:

 id | event_id | group_id | isbn
 (1,1,1,123) ok 
 (2,1,2,123) ok
 (3,1,4,123) ok
 (4,1,7,1234) ok
 (5,2,8,123) NOT OK, the 'isbn' must be unique for event_id('123' was already used in the first row with event_id = 1)

group_id появляется только один раз для каждого event_id, но если я сделаю уникальное ограничение с 3 столбцами, я смогу повторить isbn, просто изменив event_id, и я этого не хочу, как только isbn используется в event_id это не может появиться в другом event_id, event_id (скажем, «1») может повторять одно и то же ibsn столько, сколько потребуется для каждого group_id

Я знаю, что повторял проблему несколько раз, но это сложный вопрос, и я хочу снизить вероятность получения неправильных ответов.

EDIT1: об ответе @Andomar isbn должен быть связан с group_id кардинальностью (1,n) 1-isbn -> n-group_id, а структура в ответе не делает этого


person Murilo    schedule 25.10.2012    source источник


Ответы (2)


Вы описываете, что event_id зависит от isbn . Вам нужно нормализовать таблицу, разделив ее на две части:

(Исправлено):

Удалить Оставьте isbn в этом и добавьте ограничение FOREIGN KEY (event_id, isbn) во вторую таблицу ниже:

id | event_id | group_id | isbn
 1      1          1        123 
 2      1          2        123
 3      1          4        123 
 4      1          7        1234
 5      2          8        123     --- not allowed by the FK constraint

И создайте новую таблицу с isbn в качестве первичного ключа и UNIQUE (event_id, isbn) (и двумя внешними ключами: event_id в Event таблицу и isbn в (Book?), если у вас есть таблица, где isbn является первичным или уникальным ключом):

event_id | isbn
   1        123 
   1       1234 
person ypercubeᵀᴹ    schedule 25.10.2012
comment
На самом деле сработало, извините, у меня была вторая таблица с event_id, помеченная как подписанная, а в моей первой таблице она была неподписанной, поэтому столбцы были разными, поэтому я не мог установить ее как внешний ключ, теперь мне удалось это сделать, спасибо - person Murilo; 25.10.2012

Чтобы комбинация (event_id, isbn) оставалась уникальной:

create unique index UX_YourTable_EventIsbn on YourTable(event_id, isbn)

Согласно комментарию, если вы хотите иметь только одно событие для каждого isbn, вы можете изменить отношение таблицы. Создайте таблицу isbn с первичным ключом isbn и полем event_id. Таким образом, с ISBN может быть связано ноль или одно событие.

isbn          isbn primary key, event_id
other_table   id, event_id, group_id

Запрос будет искать isbns для события в таблице isbn.

person Andomar    schedule 25.10.2012
comment
как этот индекс предотвращает добавление один раз 1, 123, а затем 2, 123 для event_id, isbn? Это просто предотвратило бы добавление 1123 дважды, что сильно отличается от вопроса. - person Nedret Recep; 25.10.2012
comment
@NedretRecep: Хороший вопрос, не читал этого в вопросе. Я обновлю ответ. - person Andomar; 25.10.2012