Nie wiem, czy to jest dobre praktyki projektowania, ale na pewno to można mieć złożony klucz obcy jednej tabeli, która jest częścią złożonego klucza podstawowego innej tabeli.
że mamy test1 tablica zawierająca kompozytową klucza podstawowego (A, B)
Teraz znajduje się stół powiedzieć TEST2 posiadające klucz podstawowy (P, Q, R), gdzie (p, q) odniesienie test2 (A, B) testu 2.
Uruchomiłem następujący skrypt w bazie danych MySql i działa dobrze.
CREATE TABLE `test1` (
`A` INT NOT NULL,
`B` VARCHAR(2) NOT NULL,
`C` DATETIME NULL,
`D` VARCHAR(45) NULL,
PRIMARY KEY (`A`, `B`));
CREATE TABLE `test2` (
`P` INT NOT NULL,
`Q` VARCHAR(2) NOT NULL,
`R` INT NOT NULL,
`S` DATETIME NULL,
`T` VARCHAR(8) NULL,
PRIMARY KEY (`P`, `Q`, `R`),
INDEX `PQ_idx` (`P`,`Q` ASC),
CONSTRAINT `PQ`
FOREIGN KEY (`P`, `Q`)
REFERENCES `test1` (`A`,`B`)
ON DELETE CASCADE
ON UPDATE CASCADE);
W wyżej wymienionym przypadku, baza danych spodziewa kombinację (A, B), aby być unikalny i to, że jest kluczem podstawowym w tabeli test1.
Ale jeśli spróbujesz zrobić coś takiego po skrypt zawiedzie. Baza danych nie pozwoli Ci utworzyć tabeli test2.
CREATE TABLE `test2` (
`P` INT NOT NULL,
`Q` VARCHAR(2) NULL,
`R` DATETIME NULL,
`S` VARCHAR(8) NULL,
`T` VARCHAR(45) NULL,
INDEX `P_idx` (`P` ASC),
INDEX `Q_idx` (`Q` ASC),
CONSTRAINT `P`
FOREIGN KEY (`P`)
REFERENCES `test1` (`A`)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `Q`
FOREIGN KEY (`Q`)
REFERENCES `test1` (`B`)
ON DELETE CASCADE
ON UPDATE CASCADE);
W przypadku wyżej wymienionych danych oczekiwać kolumna A, która będzie wyjątkowa indywidualnie i tym samym następuje na kolumnie B. Nie ma znaczenia, czy połączenie (A, B) jest unikalny.
Jak zdefiniowałeś złożony klucz podstawowy? Czy dodano wyjątkowe ograniczenie w kolumnie _each_? – Oded
Ale nie chcę, aby każda kolumna była niepowtarzalna. Chcę, aby połączenie dwóch lub trzech kolumn było unikalne. – Tony
Zapytałem, jak zdefiniowałeś ograniczenia. Nie powiedziałem, że powinieneś tak je zdefiniować. – Oded