MySQL: erreur 1215( HY000): impossible d'ajouter une contrainte de clé étrangère
j'ai lu concepts de système de base de données, 6e édition, Silberschatz. Je vais implémenter le système de base de données universitaire montré dans le chapitre 2 sur OS X sur MySQL. Mais j'ai du mal à créer la table course
. la table department
ressemble
mysql> select * from department
-> ;
+------------+----------+-----------+
| dept_name | building | budget |
+------------+----------+-----------+
| Biology | Watson | 90000.00 |
| Comp. Sci. | Taylor | 100000.00 |
| Elec. Eng. | Taylor | 85000.00 |
| Finance | Painter | 120000.00 |
| History | Painter | 50000.00 |
| Music | Packard | 80000.00 |
| Physics | Watson | 70000.00 |
+------------+----------+-----------+
mysql> show columns from department
-> ;
+-----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------+------+-----+---------+-------+
| dept_name | varchar(20) | NO | PRI | | |
| building | varchar(15) | YES | | NULL | |
| budget | decimal(12,2) | YES | | NULL | |
+-----------+---------------+------+-----+---------+-------+
création de la table course
provoque l'erreur suivante.
mysql> create table course
-> (course_id varchar(7),
-> title varchar (50),
-> dept_name varchar(20),
-> credits numeric(2,0),
-> primary key(course_id),
-> foreign key (dept_name) references department);
ERROR 1215 (HY000): Cannot add foreign key constraint
après une recherche google pour contrainte de clé étrangère, je viens d'apprendre que le mot " étranger key constraint ' indique que les données de la colonne clé étrangère dans le tableau course
doit exister dans la colonne de clé primaire dans la table department
. Mais j'aurais dû répondre à cette erreur en insérant des données.
si ce n'est pas le cas, pourquoi l'auteur me fait-il exécuter cette instruction SQL?
si j'exécute vraiment une instruction SQL erronée, dois-je désigner dept_name
en cours de la table en tant que clé étrangère après l'insertion des données?
EDIT : taper set foreign_key_checks=0
en mysql>
ne pas corriger l'erreur.
------------------------
LATEST FOREIGN KEY ERROR
------------------------
2013-09-21 16:02:20 132cbe000 Error in foreign key constraint of table university/course:
foreign key (dept_name) references department):
Syntax error close to:
)
mysql> set foreign_key_checks=0
-> ;
Query OK, 0 rows affected (0.00 sec)
mysql> create table course
-> (course_id varchar(7),
-> title varchar(50),
-> dept_name varchar(20),
-> credits numeric(2,0),
-> primary key(course_id),
-> foreign key (dept_name) references department);
ERROR 1215 (HY000): Cannot add foreign key constraint
13 réponses
La syntaxe FOREIGN KEY
CREATE TABLE
est structuré comme suit:
FOREIGN KEY (index_col_name)
REFERENCES table_name (index_col_name,...)
Si votre MySQL DDL devrait être:
create table course (
course_id varchar(7),
title varchar(50),
dept_name varchar(20),
credits numeric(2 , 0 ),
primary key (course_id),
FOREIGN KEY (dept_name)
REFERENCES department (dept_name)
);
Aussi, dans le department
table dept_name
doit être VARCHAR(20)
Plus d'informations peuvent être trouvées dans le MySQL documentation
lorsque vous obtenez ce message d'erreur vague, vous pouvez trouver l'erreur la plus spécifique en lançant
SHOW ENGINE INNODB STATUS;
Les raisons les plus courantes sont que lors de la création d'une clé étrangère, le champ de référence et le champ de clé étrangère doivent correspondre:
- Moteur doit être le même par exemple InnoDB
- Type de données doit être le même, et avec la même longueur.
p.ex. VARCHAR (20) ou INT (10) UNSIGNED - Classement doit être le même. par exemple, utf8
- Unique - la clé étrangère doit renvoyer à un champ unique (habituellement) dans le tableau de référence.
une Autre cause de cette erreur est:
vous avez défini une condition SET NULL bien que certaines colonnes soient définies comme non NULL.
Peut-être que votre dept_name
les colonnes ont des charsets différents.
vous pourriez essayer d'en modifier un ou les deux:
ALTER TABLE department MODIFY dept_name VARCHAR(20) CHARACTER SET utf8;
ALTER TABLE course MODIFY dept_name VARCHAR(20) CHARACTER SET utf8;
foreign key (dept_name) references department
cette syntaxe N'est pas valide pour MySQL. Il devrait plutôt être:
foreign key (dept_name) references department(dept_name)
MySQL requiert moins de!--3-- > à utiliser deux fois. Une fois à définir la colonne étrangère, et une fois à définir la colonne principale.
13.1.17.2. Utilisation de contraintes de clé étrangère
... [la] syntaxe essentielle pour une définition de contrainte de clé étrangère dans un
CREATE TABLE
ouALTER TABLE
déclaration ressemble à ceci:[CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name (index_col_name, ...) [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION
Il est également possible d'obtenir cette erreur si la clé étrangère n'est pas une clé primaire dans une table.
j'ai fait un ALTER TABLE et j'ai accidentellement enlevé le statut de la clé primaire d'une colonne, et j'ai eu cette erreur.
ERREUR 1215 (HY000): Impossible d'ajouter une contrainte de clé étrangère
il est également intéressant de noter que vous obtenez cette erreur lorsque le tapez de la colonne qui est une clé étrangère dans une autre able ne correspond pas explicitement à la colonne dans la table correcte.
Par exemple:
alter table schoolPersons
add index FKEF5AB5E532C8FBFA (student_id),
add constraint FKEF5AB5E532C8FBFA
foreign key (student_id)
references student (id);
ERROR 1215 (HY000): Cannot add foreign key constraint
C'était parce que le student_id
champ a été défini comme suit:
mysql> desc schoolPersons;
+--------------------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+------------+------+-----+---------+----------------+
| student_id | bigint(20) | YES | | NULL | |
id
champ student
table a été défini comme:
mysql> desc persons;
+--------------+----------------------+------+-----+-------------------+-----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------------------+------+-----+-------------------+-----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
bigint(20)
(généré à partir de Java long
par hibernation) n'est pas compatible avec int(10) unsigned
(Java int
).
le code ci-dessous a fonctionné pour moi
set @@foreign_key_checks=0;
ALTER TABLE `table1` ADD CONSTRAINT `table1_fk1` FOREIGN KEY (`coloumn`) REFERENCES `table2` (`id`) ON DELETE CASCADE;
il est intéressant de noter que cette erreur peut aussi se produire si la table ou la colonne cible que vous utilisez dans la partie références n'existe tout simplement pas.
il suffit d'ajouter "non signé" pour la contrainte étrangère
`FK` int(11) unsigned DEFAULT NULL,
je ne rencontre pas le problème que vous. Mais j'obtiens le même Message d'ERREUR. Alors je le marque ici pour la convivialité des autres.
vérifiez le jeu de caractères de deux tables si le type de colonne est char
ou varchar
. J'utilise un charset=gbk
, mais j'ai créer un nouveau tableau dont la valeur par défaut charset=utf8
. Le charset n'est donc pas le même.
ERROR 1215 (HY000): Cannot add foreign key constraint
Pour le résoudre est d'utiliser le même jeu de caractères. Par exemple,utf8
.
Je ne vois personne énoncer cela explicitement et j'ai eu ce même message d'erreur et mon problème était que j'essayais d'ajouter une clé étrangère à une table temporaire. Ce qui est rejeté comme indiqué dans le manuel
les relations clés étrangères impliquent une table parent qui contient les valeurs centrales des données, et une table enfant avec des valeurs identiques pointant vers son parent. La clause de clé étrangère est spécifiée dans la table enfant. Les tables des parents et des enfants doivent: utiliser le même moteur de stockage. ils ne doivent pas être des tables temporaires.
(l'emphase est mienne)
je suis tombé sur le même problème. Je ne sais pas pourquoi cela fonctionne, mais il fonctionne vraiment: Essayez D'ajouter moteur INNODB après votre requête de création.
mysql> create table course
-> (course_id varchar(7),
-> title varchar (50),
-> dept_name varchar(20),
-> credits numeric(2,0),
-> primary key(course_id),
-> foreign key (dept_name) references department) ENGINE INNODB;
CONSTRAINT vendor_tbfk_1 FOREIGN KEY (V_CODE) REFERENCES vendor (V_CODE) ON UPDATE CASCADE
c'est comment il pourrait l'être... regarder le référencement colonne de la partie. (V_code)