Изглежда като productorder.oid
е част от първичен ключ с няколко колони и не е най-лявата колона в първичния ключ. (В бъдеще, моля, включете резултата от SHOW CREATE TABLE <tablename>
защото е по-ясно от ОПИСВАНЕ за неща като клавиши с няколко колони.)
Когато декларирате външен ключ, трябва да се позовавате на най-лявата колона на първичния ключ.
Когато препращате към първичен ключ с няколко колони, външният ключ трябва да има същия брой колони в същия ред.
Грешно (няма достатъчно колони и препраща към втората колона на първичния ключ):
CREATE TABLE parent (x INT, y INT, PRIMARY KEY (x, y));
CREATE TABLE child (y INT, FOREIGN KEY (y) REFERENCES parent(y));
Грешно (отделни външни ключове, всеки препращащ към част от съставния първичен ключ):
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)
);
Дясно (същите колони):
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));
Относно вашия коментар:
Сега си мисля, че истинският ви проблем е, че връзката ви е обърната. Опитвате се да декларирате външен ключ в deliveryaddress
препраща productorder
, но очаквам препратката да отиде в другата посока.
ALTER TABLE productorder ADD FOREIGN KEY (oid) REFERENCES deliveryaddress (oid);
Тогава нямате грешка, защото първичният ключ на deliveryaddress
е само една колона.
Вярвам, че тази връзка има по-голям смисъл в типично приложение за електронна търговия. Има много поръчки, които могат да се отнасят до един и същ адрес. Обратната връзка вероятно не е това, което искате, защото няма смисъл много адреси да препращат към една поръчка на продукт.