Mysql
 sql >> база данни >  >> RDS >> Mysql

Не може да се добави външен ключ в MySQL 5.7 (липсващо ограничение в посочената таблица)

Изглежда като 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 е само една колона.

Вярвам, че тази връзка има по-голям смисъл в типично приложение за електронна търговия. Има много поръчки, които могат да се отнасят до един и същ адрес. Обратната връзка вероятно не е това, което искате, защото няма смисъл много адреси да препращат към една поръчка на продукт.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразувайте датата във формат MM/DD/YYYY в MySQL дата

  2. Ред на колоните в индекс с няколко колони в MySQL

  3. MySQL - Ако започва с число или специален знак

  4. Как и кога да използваме SLEEP() правилно в MySQL?

  5. Laravel 4:Където не съществува