2009-11-29 17 views
8

Tengo la siguiente secuencia de comandos para crear una tabla en MySQL versión 5.1, que se refiere a otras 3 tablas. Las 3 tablas se han creado con InnoDB, y las 3 tablas tienen la columna ID definida como INT.Teclas externas y errores MySQL

He creado otras tablas con éxito que hacen referencia a CUENTA y PERSONA, sin embargo, esta es la primera tabla que hace referencia a DIRECCIÓN, por lo que he incluido la definición de esa tabla, como ejecución, a continuación también.

El error que obtengo es ERROR 1005 (HY000) con errno 150, que entiendo que se relaciona con la creación de claves foráneas.

El guión que no es (columnas adicionales retirados por simplicidad):

CREATE TABLE WORK_ORDER (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    ACCOUNT_ID INT NOT NULL, 
    CUSTOMER_ID INT NOT NULL, 
    SALES_ID INT, 
    TRADES_ID INT, 
    LOCATION_ID INT NOT NULL, 
    INDEX CUST_INDEX(CUSTOMER_ID), 
    INDEX SALES_INDEX(SALES_ID), 
    INDEX TRADES_INDEX(TRADES_ID), 
    INDEX ACCOUNT_INDEX(ACCOUNT_ID), 
    INDEX LOCATION_INDEX(LOCATION_ID), 
    FOREIGN KEY (CUSTOMER_ID) REFERENCES PERSON(ID) ON DELETE CASCADE, 
    FOREIGN KEY (SALES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL, 
    FOREIGN KEY (TRADES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL, 
    FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE, 
    FOREIGN KEY (LOCATION_ID) REFERENCES ADDRESS(ID) ON DELETE SET NULL 
) ENGINE=InnoDB; 

La instrucción SQL utilizada para crear la tabla de direcciones se encuentra por debajo (columnas adicionales removidos por simplicidad).

CREATE TABLE ADDRESS (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    PERSON_ID INT NOT NULL, 
    ACCOUNT_ID INT NOT NULL, 
    ADDRESS_L1 VARCHAR(50), 
    ADDRESS_L2 VARCHAR(50), 
    CITY VARCHAR(25), 
    PROVINCE VARCHAR(20), 
    POSTAL_CODE VARCHAR(6), 
    COUNTRY VARCHAR(25), 
    INDEX CUST_INDEX(PERSON_ID), 
    INDEX ACCOUNT_INDEX(ACCOUNT_ID), 
    FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE, 
    FOREIGN KEY (PERSON_ID) REFERENCES PERSON(ID) ON DELETE CASCADE 
) ENGINE=InnoDB; 

He navegado a través de varias preguntas aquí se ocupan de cuestiones similares, pero la mayoría parecen ser duplicados definiciones y tipos de campo no coincidentes, así como algunos no utilizar InnoDB por una u otra de las mesas. Sin embargo, ninguno de estos parece ser el problema. ¿Algunas ideas?

+2

su acción de eliminación de la clave LOCATION_ID no se ve del todo bien, ya que LOCATION_ID se define como NOT NULL. No creí que mysql comprobara esto durante la creación de restricciones, aunque ... – grossvogel

+0

¡Gracias, eso funcionó! Publicarlo como respuesta, y lo marcaré correctamente. – Elie

Respuesta

13

Siempre puede emitir un comando 'SHOW ENGINE INNODB STATUS'. Enterrado en la salida será la sección "Últimos EXTERIOR KEY ERROR", que tendrá más detalles sobre exactamente lo que causó el '150' error:

mysql> create table a (x int not null) type=innodb; 
Query OK, 0 rows affected, 1 warning (0.02 sec) 

mysql> create table b (y int not null, foreign key (y) references a (x) on delete set null) type=innodb; 
ERROR 1005 (HY000): Can't create table './test/b.frm' (errno: 150) 

mysql> show engine innodb status; 
[..... snip snip snip ...] 
------------------------ 
LATEST FOREIGN KEY ERROR 
------------------------ 
091129 16:32:41 Error in foreign key constraint of table test/b: 
foreign key (y) references a (x) on delete set null) type=innodb: 
You have defined a SET NULL condition though some of the 
columns are defined as NOT NULL. 
[.... snip snip snip ...] 
+0

Genial, aprende algo nuevo todos los días (supongo que eso significa que estoy descolgado para aprender durante el resto del día). – Elie

Cuestiones relacionadas