sql >> Base de Datos >  >> RDS >> Mysql

SQL no puede crear la tabla (errno:150)

Debe crear una restricción de clave externa que haga referencia al completo clave primaria o única de cada tabla referenciada. No puede crear claves externas separadas para columnas individuales en el medio de la clave principal de la tabla de referencias.

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)
);

Usé la palabra debería anterior porque InnoDB es en realidad un poco más indulgente que el estándar ANSI/ISO SQL cuando se trata de claves foráneas. SQL estándar dice que las columnas de la clave externa deben ser la lista completa de columnas de la clave primaria o única a la que se hace referencia.

InnoDB le permite usar un subconjunto de columnas, siempre que sean un prefijo izquierdo de esas columnas. Pero no debería hacer eso, porque obtiene resultados realmente confusos cuando una fila secundaria puede hacer referencia a múltiples filas en su tabla principal.