Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SQL não pode criar tabela (errno:150)


Você deve fazer uma restrição de chave estrangeira referenciando o full chave primária ou exclusiva de cada tabela referenciada. Você não pode separar chaves estrangeiras para colunas individuais no meio da chave primária da tabela de referências.
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)
);

Usei a palavra deveria acima porque o InnoDB é na verdade um pouco mais tolerante do que o padrão ANSI/ISO SQL quando se trata de chaves estrangeiras. O SQL padrão diz que as colunas da chave estrangeira devem ser a lista completa de colunas da chave primária ou exclusiva referenciada.

O InnoDB permite que você use um subconjunto de colunas, desde que sejam um prefixo esquerdo dessas colunas. Mas você não deve fazer isso, porque você obtém resultados muito confusos quando uma linha filha pode fazer referência a múltiplos linhas em sua tabela pai.