Problemas con Foreign Key (can\'t create table ...)

Fernando Poblete Arrau
13 de Agosto del 2009
Hola, mi problema es:
tengo una tabla (la voy a llamar TablaA) con una Primary Key de dos campos, cada uno de los cuales es una Foreign Key hacia una Primary Key de otras tablas (TablaB y TablaC).
En la tabla A cree indices para ambos campos y todas las tablas son tipo InnoDB.
Estoy haciendo lo siguiente:

ALTER TABLE TablaA
ADD CONSTRAINT C1 FOREIGN KEY(campo1) REFERENCES TablaB(campoX) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE TablaA
ADD CONSTRAINT C2 FOREIGN KEY(campo2) REFERENCES TablaB(campoX) ON DELETE CASCADE ON UPDATE CASCADE;

Obtengo el siguiente mensaje de error:
ERROR 1005: Can't create table './test/#sql-84b_4.frm' (errno: 150)

¿alguien me puede ayudar?
Muchas gracias.

Maxxi
13 de Agosto del 2009
Gracias tenia el mismo problema, y era que la columna origen y destino eran del tipo diferente una era bigint y la otra int con distia longitud.
Gracias a los que aportaron la solucion.

King Arthur
13 de Agosto del 2009
Primero se deben definir como llaves primarias todos los campos que van a incluir, luego hay que agregar con el signo + una foreign key que aparece como fk_nombre_tabla_1, luego hay que referenciar la tabla de donde se encuentra la llave

todovale
13 de Agosto del 2009
jajaja puta mare es un error estupido menos mal lo solucione en 15 minutos, ese error sale cuando craer llaves foranea de tablas en donde no declaraste la llave primary, espero les ayude en esto.. atentamente http://todovale.no-ip.com

breiner lopez
13 de Agosto del 2009
Reciban cordial saludo.
Depronto llego un poco tarde al foro pero en todas partes hablan de como resolver problemas pero yo el problema que tengo es que no se crear una llave foranea yo veo que en distintos foros usan diferentes terminos para su creacion pero en ninguno explican porque las sentencias ni sus valores alguien me podia ayudar mi correo es [email protected]

Christian
13 de Agosto del 2009
Aveces sucede ese error cuando los nombres delas referencias son igules por ejemplo:
CONSTRAINT `(1n)Tiene` FOREIGN KEY (`codex`)
REFERENCES `excursion`(`codex`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `(1n)Contiene` FOREIGN KEY (`codhot`)
REFERENCES `hotel`(`codhot`)
ON DELETE NO ACTION
ON UPDATE NO ACTION
Los CONSTRAINT `(1n)Contiene` CONSTRAINT `(1n)Tiene` no deben ser igules si es una tabla de referencias cruzadas recomendable cambiar todas las referencias (nombres ) ala base de datos. Espero que les sirva

rippman
13 de Agosto del 2009
tengan en cuenta lo que les han comentado antes, que es todo de mucha ayuda.

Yo por mi parte aporto el consejo de que tengan mucho cuidado con que los tipos de datos sean los mismos; aunque pueda parecer una tontería.

Hoy mismo he tenido problemas por intentar asociar un indice tipo 'int' a uno tipo 'unsigned int'. y me he tardado un rato hasta que me he dado cuenta.

Rippman.

Santi GL
13 de Agosto del 2009
comprueba que todos los campos que intervienen en la foreign key son índices tanto en la tabla origen como en la destino

Fernando Poblete Arrau
13 de Agosto del 2009
Todos los campos inc`volucrados (en ambas tablas) son indices...aun asi no funciona.
Gracias de todas formas

ChaTo
13 de Agosto del 2009
Cosas a verificar:

1. Ambas tablas son INNODB
2. El tipo de datos coincide
3. La llave foreanea es llave primaria en la tabla destino
4. escribes FOREIGN y no FOREING (tipico)

Saludos.

Amable
13 de Agosto del 2009
CREATE TABLE facultad (
cod_fac INTEGER(10) UNSIGNED NOT NULL,
cod_sed INTEGER(11) NOT NULL,
nombe CHAR(80) NOT NULL,
PRIMARY KEY(cod_fac),
FOREIGN KEY(cod_sed)
REFERENCES sede(cod_sed)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
TYPE=InnoDB;

CREATE TABLE carrera (
cod INTEGER(10) UNSIGNED NOT NULL,
cod_fac INTEGER(10) UNSIGNED NOT NULL,
nombre CHAR(80) NOT NULL,
PRIMARY KEY(cod),
FOREIGN KEY(cod_fac)
REFERENCES facultad(cod_fac)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
TYPE=InnoDB;
me asegure que la la llave FK en la tabla hijo tenga el mismo tipo que en la tabla padre y aún así sale tengo el mismo problema:
#1005 - Can't create table '.admisionfacultad.frm' (errno: 150)

Sergio
13 de Agosto del 2009
Creo que lo que debe pasar es que la columna que es clave foránea debe estar definida con un tipo diferente a en la tabla donde es clave primaria. A mi me ha pasado con smallint y mediumint (ya me dirás hasta que me di cuenta del error).


Un saludo

Javier
13 de Agosto del 2009
Gracias por la solución, estaba volviendome loco y al final era una tontada del calibre 30. Un saludo desde pamplona

Draka
13 de Agosto del 2009
que version de MySql tienes, antes de la version 4.0.2 hay muchos problemas en crearlas, te recomiendo mejor que bajes la version 4.1, asi digan que es un beta.

No jode tanto.

Draka
13 de Agosto del 2009
Otra cosa que se me habia pasado es que seguramente los campos a los que le va a ingresar la llave foranea no son INDICES.

Tienen que ser indices o si no sale ese error.
con este comando
SHOW INNODB STATUS;
Le muestra el ultimo error

Vargav
13 de Agosto del 2009
Hola.

A mi me pasaba exactamente el mismo error que a ti te sucede.

He conseguido corregir el problema, veras todas las tablas que se encuentren relacionadas mediante las foreign deben ser del tipo InnoDB. Si alguna de las tablas en las que estas definiendo las relaciones no es de este tipo salta el error que comentas.

Asegurate de que todas las tablas son del tipo InnoDB y vuelve a probar.

A mi se me solucionó el problema.