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

SQL Nie można utworzyć tabeli (errno:150)

Powinieneś utworzyć jedno ograniczenie klucza obcego odwołujące się do pełnego klucz podstawowy lub unikalny każdej tabeli, do której się odwołuje. Nie możesz utworzyć oddzielnych kluczy obcych dla poszczególnych kolumn w środku klucza podstawowego tabeli odnośników.

CREATE TABLE prospect
(Custname      VARCHAR(25) NOT NULL,
 Carmake       VARCHAR(25) NOT NULL,
 Carmodel      VARCHAR(20) NOT NULL,
 Caryear       VARCHAR(4) NOT NULL,
 Carextcolour  VARCHAR(10) NOT NULL,
 Cartrim       VARCHAR(10) NOT NULL,
 Optioncode    CHAR(4),
 CONSTRAINT pkprospect PRIMARY KEY (Custname, Carmake, Carmodel, Caryear, Carextcolour,           Cartrim, Optioncode),
 CONSTRAINT fkprospect FOREIGN KEY (Custname) REFERENCES customer(Custname),
 CONSTRAINT fk2prospect FOREIGN KEY (Carmake, Carmodel, Caryear, Carextcolour, Cartrim)
   REFERENCES car(Carmake, Carmodel, Caryear, Carextcolour, Cartrim),
 CONSTRAINT fk7prospect FOREIGN KEY (Optioncode) REFERENCES optiontable(Optioncode)
);

Użyłem słowa powinien powyżej, ponieważ InnoDB jest w rzeczywistości nieco łagodniejszy niż standard ANSI/ISO SQL, jeśli chodzi o klucze obce. Standardowy SQL mówi, że kolumny klucza obcego muszą być pełną listą kolumn przywoływanego klucza podstawowego lub unikatowego.

InnoDB pozwala na użycie podzbioru kolumn, o ile są one lewym przedrostkiem tych kolumn. Ale nie powinieneś tego robić, ponieważ otrzymasz bardzo mylące wyniki, gdy wiersz podrzędny może odwoływać się do wielu wierszy w swojej tabeli nadrzędnej.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie o dokładne dopasowanie ciągu w SQL

  2. Wyszukiwanie pełnotekstowe z InnoDB

  3. MySQL, uzyskaj rangę użytkowników

  4. PDO::PARAM dla dat?

  5. Jak wykonać mysqldump bez pytania o hasło?