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
44
demandé sur inherithandle 2013-09-21 11:28:52

13 réponses

La syntaxe FOREIGN KEYCREATE 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

42
répondu Strik3r 2013-12-31 10:02:36

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.

55
répondu Andrew 2016-06-08 06:07:55

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;
22
répondu workflo 2014-09-11 12:45:22
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 ou ALTER 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
6
répondu ta.speot.is 2013-09-21 08:20:13

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.

3
répondu user2255242 2016-10-25 22:36:11

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).

3
répondu Gray 2017-05-18 22:07:04

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;
1
répondu Anjaneyulu Batta 2017-11-01 10:55:17

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.

0
répondu Amalgovinus 2016-01-12 23:58:25

il suffit d'ajouter "non signé" pour la contrainte étrangère

`FK` int(11) unsigned DEFAULT NULL,
0
répondu vedavyasa 2017-03-04 00:19:33

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.

0
répondu g10guang 2017-11-20 12:20:46

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)

0
répondu EdgeCaseBerg 2018-04-06 16:00:23

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;
0
répondu Shiyao 2018-05-18 04:49:07
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)

-1
répondu naube 2016-09-06 10:20:59