Pregunta

Recibo este error cuando intento agregar una contenido de clave extranjera:

#1005 - Can't create table './testtable/#sql-595_146.frm' (errno: 150)

Necesito hacer una cascada On Delete para todas las imágenes que comparten una ID de proyecto cuando se elimina ese proyecto. Mi estructura de mesa simplificada es la siguiente:

CREATE TABLE IF NOT EXISTS `images` (
`image_id` mediumint(8) unsigned NOT NULL auto_increment,
`project_id` smallint(6) NOT NULL,
PRIMARY KEY  (`image_id`),
KEY `project_id_ix` (`project_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=28 ;

CREATE TABLE IF NOT EXISTS `projects` (
`project_id` smallint(5) unsigned NOT NULL auto_increment,
PRIMARY KEY  (`project_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

Ahora, cuando ejecuto la consulta a continuación para agregar la restricción, la consulta falla con el error publicado anteriormente. ¿Alguien podría ayudar?

ALTER TABLE `images` ADD CONSTRAINT `project_id_fk` FOREIGN KEY (`project_id`) REFERENCES `projects` (`project_id`) ON DELETE CASCADE;

¡Un millón de gracias!

¿Fue útil?

Solución

Cambiar el project_id columnas para tener el mismo tamaño smallint(6) (o 5). También debe hacerlos firmados o sin firmar.

... del sitio web de MySQL dice:

Las columnas correspondientes en la clave extranjera y la clave referenciada deben tener tipos de datos internos similares dentro de Innodb para que puedan compararse sin una conversión de tipo. El tamaño y el signo de los tipos enteros deben ser los mismos. La longitud de los tipos de cadena no es necesario que sea la misma. Para las columnas de cadena no binarias (caracteres), el conjunto de caracteres y la recopilación deben ser los mismos.

Otros consejos

Pensé que el tipo de datos debía coincidir. Project_ID es SmallInt (6) en una mesa y SmallInt (5) en la otra.

¿No deberían ser los proyectos_id ambos? smallint(6)?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top