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, je reçois ce message d'erreur:
Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150)
Erreur dans l'état INNODB:
120405 14:02:57 Erreur dans la contrainte de clé étrangère de la table mytable. # 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, cela fonctionne, mais avec une mauvaise action "on delete":
ALTER TABLE `katalog`
ADD FOREIGN KEY (`Sprache` ) REFERENCES `sprache` (`ID` )
Les deux tables sont InnoDB et les deux champs sont "INT (11) non null". J'utilise MySQL 5.1.61. Essayer de lancer cette requête ALTER avec MySQL Workbench (le plus récent) sur un MacBook Pro.
Tableau Créer des instructions:
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
mysql
foreign-keys
frgtv10
la source
la source
SHOW CREATE TABLE
, je ne peux que demander - le nom de la colonne est-il vraiment ID, en majuscules?katalog
aint(11) unsigned
.sprache
n'a pas lausigned
partie, donc deux colonnes ne sont pas identiques.auto_increment
colonnes, ce qui est mauvais. En outre, 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.
. Par conséquent, oui, un type de données similaire et le même signe.Réponses:
Pour ajouter une clé étrangère (grade_id) à une table existante (utilisateurs), procédez comme suit:
la source
Utilisez simplement cette requête, je l'ai essayée selon mon scénario et cela fonctionne bien
la source
Étapes simples ...
la source
vérifiez ce lien. Cela m'a aidé avec errno 150: http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/
Au sommet de ma tête, deux choses me viennent à l'esprit.
Je suppose que le problème est avec l'ensemble NULL lors de la mise à jour (si mon cerveau n'est pas à l'envers aujourd'hui comme c'est souvent le cas ...).
Edit: j'ai raté les commentaires sur votre post d'origine. Les colonnes int non signées / non signées peuvent résoudre votre cas. J'espère que mon lien aide quelqu'un dans la pensée future.
la source
Mais votre table a:
Il ne peut pas définir la colonne Sprache sur NULL car elle est définie comme NOT NULL.
la source
MySQL exécutera cette requête:
À votre santé!
la source
Comment réparer
Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150) in mysql.
modifier votre table et y ajouter un index ..
Ajoutez maintenant la contrainte
Notez que si vous n'ajoutez pas d'index, cela ne fonctionnera pas.
Après avoir lutté avec elle pendant environ 6 heures, j'ai trouvé la solution, j'espère que cela sauvera une âme.
la source
Lorsque vous ajoutez une contrainte de clé étrangère à une table à l'aide de ALTER TABLE, n'oubliez pas de créer d'abord les index requis.
la source
essayez tout en une seule requête
la source
cela se produit essentiellement parce que vos tables sont dans deux jeux de caractères différents. par exemple, une table créée dans charset = utf-8 et d'autres tables sont créées dans CHARSET = latin1 afin que vous souhaitiez pouvoir ajouter une clé foriegn à ces tables. utilisez le même jeu de caractères dans les deux tableaux, vous pourrez alors ajouter des clés foriegn. erreur 1005 foriegn contrainte de clé incorrectement formée peut résoudre à partir de ce
la source
j'ai traversé le même problème. Dans mon cas, le tableau contient déjà des données et il y avait des clés dans ce tableau qui n'étaient pas présentes dans le tableau de référence. J'ai donc dû supprimer ces lignes qui ne respectaient pas les contraintes et tout fonctionnait.
la source
étape 1: exécutez ce script
étape 2: ajouter une colonne
étape 3: ajouter une clé étrangère à la colonne ajoutée
étape 4: exécutez ce script
la source
Exemple:-
la source