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?
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
¡Gracias, eso funcionó! Publicarlo como respuesta, y lo marcaré correctamente. – Elie