Составной ключ формируется из нескольких столбцов. Обычно составной ключ применяется в таблице пересечений, такой как BugsProducts. Первичный ключ должен гарантировать однократное появление в таблице любой указанной комбинации значений bug_id и product_id, даже если каждое из этих значений встречается в разных парах по несколько раз.
Однако когда в качестве первичного ключа используется обязательный столбец id, ограничение больше не действует в отношении двух столбцов, которые должны быть уникальными.
Файл примера:JD-Required/anti/superfluous.sql
CREATE TABLE BugsProducts (
id SERIAL PRIMARY KEY,
bug_id BIGINT UNSIGNED NOT NULL,
product_id BIGINT UNSIGNED NOT NULL,
FOREIGN KEY (bug_id) REFERENCES Bugs(bug_id),
FOREIGN KEY (product_id) REFERENCES Products(product_id)) ;
INSERT INTO BugsProducts (bug_id, product_id)
VALUES (1234, 1), (1234, 1), (1234, 1); — присутствие дубликатов разрешается
Наличие дубликатов в данной таблице пересечений приводит к непредсказуемым результатам при использовании таблицы для сопоставления Bugs с Products. Чтобы предотвратить появление дубликатов, можно было бы объявить ограничение UNIQUE ПО двум столбцам помимо столбца id:
Файл примера:JD-Required/anti/superfluous.sql
CREATE TABLE BugsProducts (
id SERIAL PRIMARY KEY,
bug_id BIGINT UNSIGNED NOT NULL,
product_id BIGINT UNSIGNED NOT NULL,
UNIQUE KEY (bug_id, product_id),
FOREIGN KEY (bug_id) REFERENCES Bugs(bug_id),
FOREIGN KEY (product_id) REFERENCES Products(product_id)) ;
Но если по какой-то причине необходимо уникальное ограничение по этим двум столбцам, столбец id становится избыточным.
Опубликовал vovan666
June 18 2013 12:25:31 ·
0 Комментариев ·
4008 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.