Oto prosta tabela, w której rekordy mogą odnosić się do rekordów nadrzędnych w tej samej tabeli:
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)
);
Z dodatkowym wymogiem, że jedna z pozostałych wartości pól ( num
) musi być identyczna między rekordami nadrzędnymi i podrzędnymi, pomyślałem, że złożony klucz obcy powinien załatwić sprawę. Zmieniłem ostatnią linię na
FOREIGN KEY (parent_id, num) REFERENCES foo(id, num)
i dostał BŁĄD: nie ma unikalnego ograniczenia pasującego do podanych kluczy dla tabeli, do której istnieje odniesienie „foo” .
Mogę z łatwością dodać to ograniczenie, ale nie rozumiem, dlaczego jest to konieczne, skoro jedna z kolumn, do których istnieją odniesienia ( id
), jest już gwarantowana jako niepowtarzalna? Z mojego punktu widzenia nowe ograniczenie byłoby zbędne.
NULL != NULL
. W każdym razie .. :)