Вот простая таблица, где записи могут ссылаться на родительские записи в той же таблице:
CREATE TABLE foo (
id SERIAL PRIMARY KEY,
parent_id INT NULL,
num INT NOT NULL,
txt TEXT NULL,
FOREIGN KEY (parent_id) REFERENCES foo(id)
);
С добавленным требованием, что одно из значений других полей ( num
) должно быть одинаковым в родительских и дочерних записях, я подумал, что составной внешний ключ должен помочь. Я изменил последнюю строку на
FOREIGN KEY (parent_id, num) REFERENCES foo(id, num)
и получил ОШИБКУ: не существует уникального ограничения, соответствующего данным ключам для ссылочной таблицы "foo" .
Я легко могу добавить это ограничение, но я не понимаю, почему это необходимо, когда один из столбцов, на которые есть ссылки ( id
), уже гарантированно является уникальным? На мой взгляд, новое ограничение будет излишним.
NULL != NULL
. Во всяком случае .. :)UNIQUE INDEX
где находятся колонкиNULLABLE
... вот почему я упомянул это. :) Но я согласен - в случае отсутствия NULL (и не частичного индекса) это, вероятно, довольно просто.Внешние ключи в общем (не только составные) ДОЛЖНЫ указывать на УНИКАЛЬНЫЙ КЛЮЧ некоторого вида в другой таблице. Если бы они этого не сделали, не было бы никакой целостности реляционных данных.
Это вызывает недовольство, потому что, хотя у вас есть уникальный ключ на (id) ... у вас нет уникального ключа на (id, num) .. Таким образом, что касается БД, пара (id, num) НЕ ГАРАНТИРУЕТСЯ быть уникальным. Мы, как люди, можем понять, что это будет уникально, но я уверен, что было бы много дополнительного кода, который они должны были бы добавить, чтобы сделать Postgres достаточно умным, чтобы увидеть, что "о, эй ... id должен быть уникальным , id, num также должен быть уникальным "..
Я был бы очень удивлен, если бы они добавили этот код, когда все, что вам нужно сделать, это создать еще один уникальный индекс для двух столбцов, чтобы решить проблему.
Просто чтобы прояснить, код, который они должны были бы добавить, не был бы таким простым делом ... он должен был бы обрабатывать все случаи, даже те, где внешний ключ находится на 4+ столбцах и т. Д. Я уверен логика была бы довольно сложной.
источник