MySQL table avec une colonne de type varchar comme clé étrangère
Je suis en train de créer une table avec une colonne de type varchar comme clé étrangère mais que MySql me donne une erreur lors de la création de la table. Ma requête est comme ceci:
CREATE TABLE network_classes (
id TINYINT(1) UNSIGNED NOT NULL AUTO_INCREMENT,
category VARCHAR(80) NOT NULL,
PRIMARY KEY(id),
KEY `key_1` (`id`,`category`)
)
ENGINE=InnoDB;
CREATE TABLE networks (
id TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
category VARCHAR(80) NOT NULL,
director_id TINYINT(3) UNSIGNED NULL,
director_name VARCHAR(100) NULL,
description VARCHAR(1000) NULL,
last_modified TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
user_id SMALLINT UNSIGNED NULL,
PRIMARY KEY(id),
KEY `networks_fk1` (`category`),
CONSTRAINT `networks_fk1` FOREIGN KEY (`category`) REFERENCES `network_classes` (`category`) ON DELETE NO ACTION,
INDEX networks_index2471(name),
INDEX networks_index2472(director_id, director_name)
)
ENGINE=InnoDB;
et j'obtiens cette erreur:
[Err] 1215 - Cannot add foreign key constraint
Je suis de l'utilisation de MySQL 5.6.12. Comment puis-je réécrire ma requête à résoudre ce problème?
OriginalL'auteur Hamid Ghorashi | 2013-08-22
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez avoir qu'une clé étrangère référençant un champ unique. Modifier votre network_classes table de sorte que le champ catégorie est unique, comme ci-dessous
Vous devriez être en mesure d'ajouter la clé étrangère vous voulez
OriginalL'auteur neildt
Pourquoi les 2 colonnes varchar avec la même taille correspond pas au type de? Et bien sûr, la réponse est évidente classement. S'avère que, dans la nouvelle table de la colonne était en UTF-8 au lieu de l'ASCII comme dans la table référencée. Changé ascii et fait.
également digne de mention, assurez-vous qu'ils sont tous les deux tables InnoDB
OriginalL'auteur Ch Zeeshan
La cible d'un
FOREIGN KEY
contrainte doit être indexé. Habituellement, c'est unePRIMARY KEY
donc ce n'est pas un problème, mais dans votre cas, il n'est pas (bien que c'est une partie d'une clé composée, c'est pas assez)Créer un index sur votre
network_classes
.category
domaine:Puis re-créer votre
networks
table.OriginalL'auteur Jeremy Smyth
dans
vous avez utilisé network_classess au lieu de network_classes (comme dans votre script de création de table), de sorte que la table n'existe pas.
MODIFIER
Nom de votre contrainte est la même que celle de la clé (networks_fk1) changement.
J'ai lu mieux votre DDL.
Votre table network_classes a une clé primaire ID, donc c'est correct de mettre comme clé étrangère d'un champ à lier votre id de champ, le champ de la catégorie ne doit pas apparaître dans le tableau de réseau, mais je pense que vous devez mettre fk_network_class (int) lié à l'id (de network_classes)
Votre network_classess est vide? Une autre chose, si vous définissez une clé primaire composite, la clé étrangère doit être égal (il n'est pas d'impact sur votre erreur)
oui, il est. pouvez-vous s'il vous plaît exécuter la requête sur votre côté? Je suis à la recherche d'une solution pratique plutôt que théorique imagination.
J'ai exécuter la requête sur mon PC et j'ai la même erreur. - Je changer la clé étrangère (point d'id de network_classes) type de champ (catégorie de devenir fk_network_class int), et c'est OK
J'ai déjà essayé la même chose que j'ai trouvé ici: stackoverflow.com/questions/1285417/... comparant à ma propre sql nothig semble être erronée. Je l'ai utilisé sans problème. quelle est donc la différence entre les deux?
OriginalL'auteur Joe Taras