Pregunta

Tengo el siguiente script 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.

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 también he incluido la definición para esa tabla, como se ejecuta, a continuación.

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

El script que falla es (columnas adicionales eliminadas 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 ADDRESS se encuentra a continuación (columnas adicionales eliminadas 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 examinado varias preguntas aquí que tratan problemas similares, pero la mayoría parecen ser definiciones duplicadas y tipos de campo no coincidentes, así como algunas que no usan InnoDB para una u otra de las tablas. Sin embargo, ninguno de estos parece ser el problema. ¿Alguna idea?

¿Fue útil?

Solución

Siempre puede emitir un comando 'SHOW ENGINE INNODB STATUS'. Enterrado en la salida habrá un `` ÚLTIMO ERROR DE CLAVE EXTRANJERA '' sección, que tendrá más detalles sobre exactamente qué causó el error '150':

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 ...]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top