Vypadá to jako productorder.oid
je součástí vícesloupcového primárního klíče a nejedná se o sloupec zcela vlevo v primárním klíči. (V budoucnu prosím uveďte výsledek SHOW CREATE TABLE <tablename>
protože je srozumitelnější než POPISOVAT o věcech, jako jsou vícesloupcové klíče.)
Když deklarujete cizí klíč, musíte odkazovat na sloupec primárního klíče zcela vlevo.
Když odkazujete na primární klíč s více sloupci, cizí klíč musí mít stejný počet sloupců ve stejném pořadí.
Špatně (nedostatek sloupců a odkaz na druhý sloupec primárního klíče):
CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));
CREATE TABLE child (y INT, FOREIGN KEY (y) REFERENCES parent(y));
Špatně (jednotlivé cizí klíče, z nichž každý odkazuje na část složeného primárního klíče):
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)
);
Vpravo (stejné sloupce):
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));
K vašemu komentáři:
Teď si myslím, že tvůj skutečný problém je v tom, že máš obrácený vztah. Pokoušíte se deklarovat cizí klíč v deliveryaddress
odkazující na productorder
, ale očekával bych, že odkaz půjde opačným směrem.
ALTER TABLE productorder ADD FOREIGN KEY (oid) REFERENCES deliveryaddress (oid);
Pak nemáte žádnou chybu, protože primární klíč je deliveryaddress
je pouze jeden sloupec.
Věřím, že tento vztah dává větší smysl v typické aplikaci elektronického obchodování. Existuje mnoho objednávek, které mohou odkazovat na stejnou adresu. Opačný vztah pravděpodobně není to, co chcete, protože nemá smysl, aby mnoho adres odkazovalo na jedinou objednávku produktu.