Je veux ajouter une clé étrangère à une table appelée "katalog".
ALTER TABLE katalog
ADD CONSTRAINT `fk_katalog_sprache`
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL;
Lorsque j'essaie de le faire, j'obtiens ce message d'erreur :
Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150)
Erreur dans le statut INNODB :
120405 14:02:57 Erreur dans la contrainte de clé étrangère de la table matable.#sql-7fb1_7d3a :
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL:
Cannot resolve table name close to:
(`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL
Lorsque j'utilise cette requête, elle fonctionne, mais avec une action "on delete" erronée :
ALTER TABLE `katalog`
ADD FOREIGN KEY (`Sprache` ) REFERENCES `sprache` (`ID` )
Les deux tables sont InnoDB et les deux champs sont "INT(11) not null". J'utilise MySQL 5.1.61. J'essaie de lancer cette ALTER Query avec MySQL Workbench (la plus récente) sur un MacBook Pro.
Table Créer des déclarations :
CREATE TABLE `katalog` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`Name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`AnzahlSeiten` int(4) unsigned NOT NULL,
`Sprache` int(11) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `katalogname_uq` (`Name`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC$$
CREATE TABLE `sprache` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Bezeichnung` varchar(45) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `Bezeichnung_UNIQUE` (`Bezeichnung`),
KEY `ix_sprache_id` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
1 votes
Puisque vous n'avez pas posté la sortie de
SHOW CREATE TABLE
Je ne peux que demander : le nom de la colonne est-il vraiment ID, en majuscules ?0 votes
Eh bien, c'est plus facile à repérer maintenant -
katalog
aint(11) unsigned
.sprache
n'a pas leusigned
partie, donc deux colonnes ne sont pas les mêmes.0 votes
Voulez-vous dire que les deux champs primaires doivent avoir le même type de données ?
4 votes
C'est le problème de votre conception : premièrement, vous faites référence à deux
auto_increment
colonnes, ce qui est mauvais. De plus, le manuel de MySQL dit :Corresponding columns in the foreign key and the referenced key must have similar internal data types inside InnoDB so that they can be compared without a type conversion. The size and sign of integer types must be the same. The length of string types need not be the same. For nonbinary (character) string columns, the character set and collation must be the same.
. Donc, oui, similaire et le même signe.2 votes
Je ne fais pas référence à deux champs auto-incrémentés. katalog.Sprache (not auto) -> sprache.ID (auto)
0 votes
Un +1 à N.B. Dans mon cas, j'avais un script où la première lettre du nom de la table n'était pas en majuscule dans la définition de la contrainte.