Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Nie można dodać klucza obcego w MySQL 5.7 (brak ograniczenia w tabeli odniesienia)

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak działa funkcja RIGHT() w MySQL

  2. Czy MySQL ponownie użyje usuniętych identyfikatorów po zastosowaniu automatycznego przyrostu?

  3. W SQL / MySQL, jaka jest różnica między ON i WHERE w instrukcji join?

  4. Programowa aktualizacja zamówień Woocommerce

  5. Jak sprawić, by MySQL używał INDEXu do zapytań o widok?