Question

J'obtiens cette erreur en essayant d'ajouter une contribution à la clé étrangère:

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

J'ai besoin de faire une cascade de suppression sur toutes les images qui partagent un ID de projet lorsque ce projet est supprimé. Ma structure de table simplifiée est la suivante:

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 ;

Maintenant, lorsque j'exécute la requête ci-dessous pour ajouter la contrainte, la requête échoue avec l'erreur publiée ci-dessus. Quelqu'un pourrait-il aider?

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

Mille mercis!

Était-ce utile?

La solution

Changer la project_id colonnes pour avoir la même taille smallint(6) (ou 5). Vous devez également les rendre à la fois signés ou non signés.

... Sur le site Web de MySQL, il dit:

Les colonnes correspondantes dans la clé étrangère et la clé référencée doivent avoir des types de données internes similaires dans InNODB afin qu'ils puissent être comparés sans conversion de type. La taille et le signe des types entiers doivent être les mêmes. La longueur des types de chaînes n'a pas besoin d'être la même. Pour les colonnes de chaîne non binaires (caractères), le jeu de caractères et la collation doivent être les mêmes.

Autres conseils

Je pensais que le type de données devait correspondre. project_id est smallInt (6) dans un tableau et smallInt (5) dans l'autre.

Les projets ne devraient-ils pas tous les deux smallint(6)?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top