Wygląda jak productorder.oid
jest częścią wielokolumnowego klucza podstawowego i nie jest pierwszą kolumną z lewej strony klucza podstawowego. (W przyszłości prosimy o uwzględnienie wyniku SHOW CREATE TABLE <tablename>
ponieważ jest to bardziej zrozumiałe niż DESCRIBE na temat takich rzeczy jak klawisze wielokolumnowe).
Kiedy deklarujesz klucz obcy, musisz odwołać się do skrajnej lewej kolumny klucza podstawowego.
Gdy odwołujesz się do wielokolumnowego klucza podstawowego, klucz obcy musi mieć taką samą liczbę kolumn w tej samej kolejności.
Nieprawidłowo (za mało kolumn i odwołanie do drugiej kolumny klucza podstawowego):
CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));
CREATE TABLE child (y INT, FOREIGN KEY (y) REFERENCES parent(y));
Nieprawidłowo (indywidualne klucze obce, z których każdy odwołuje się do części złożonego klucza podstawowego):
CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));
CREATE TABLE child (x INT, y INT,
FOREIGN KEY (x) REFERENCES parent(x),
FOREIGN KEY (y) REFERENCES parent(y)
);
Po prawej (te same kolumny):
CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));
CREATE TABLE child (x INT, y INT, FOREIGN KEY (x, y) REFERENCES parent(x, y));
Odpowiedz na swój komentarz:
Teraz myślę, że twoim prawdziwym problemem jest odwrócenie relacji. Próbujesz zadeklarować klucz obcy w deliveryaddress
odniesienie do productorder
, ale spodziewam się, że odniesienie pójdzie w innym kierunku.
ALTER TABLE productorder ADD FOREIGN KEY (oid) REFERENCES deliveryaddress (oid);
Wtedy nie masz błędu, ponieważ klucz podstawowy deliveryaddress
to tylko jedna kolumna.
Uważam, że ta relacja ma więcej sensu w typowej aplikacji e-commerce. Istnieje wiele zamówień, które mogą odnosić się do tego samego adresu. Odwrotna relacja prawdopodobnie nie jest tym, czego chcesz, ponieważ nie ma sensu, aby wiele adresów odnosiło się do pojedynczego zamówienia produktu.