it-swarm.com.de

MySQL: ERROR 1215 (HY000): Fremdschlüsseleinschränkung kann nicht hinzugefügt werden

Ich habe Datenbanksystemkonzepte , 6. Auflage, Silberschatz gelesen. Ich werde das Universitätsdatenbanksystem implementieren, das in Kapitel 2 zu OS X unter MySQL gezeigt wird. Ich habe jedoch Probleme beim Erstellen der Tabelle course. die Tabelle department sieht so aus

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    |       |
+-----------+---------------+------+-----+---------+-------+

Das Erstellen der Tabelle course verursacht den folgenden Fehler.

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

nach der Suche nach Fremdschlüsseleinschränkung bei Google habe ich erfahren, dass die Fremdschlüsseleinschränkung von Word bedeutet, dass Daten aus der Fremdschlüsselspalte in der Tabelle course in der Primärschlüsselspalte in der Tabelle department vorhanden sein müssen. Aber ich hätte diesen Fehler beim Einfügen von Daten treffen müssen. 

Wenn nicht, warum führt mich der Autor dazu aus, diese SQL-Anweisung auszuführen? 

Wenn ich wirklich eine fehlerhafte SQL-Anweisung ausführte, muss ich dept_name in der Kurstabelle nach dem Einfügen einiger Daten als Fremdschlüssel festlegen?

EDIT: Durch Eingabe von set foreign_key_checks=0 in mysql> wird der Fehler nicht behoben.

------------------------
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
49
inherithandle

Die Syntax von FOREIGN KEY für CREATE TABLE ist wie folgt aufgebaut:

FOREIGN KEY (index_col_name)
        REFERENCES table_name (index_col_name,...)

Ihre MySQL-DDL sollte also Folgendes sein:

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

In der department-Tabelle sollte dept_nameVARCHAR(20) sein.

Weitere Informationen finden Sie in der MySQL-Dokumentation

45
Strik3r

Wenn Sie diese vage Fehlermeldung erhalten, können Sie den spezifischeren Fehler durch Ausführen ermitteln 

SHOW ENGINE INNODB STATUS;

Die häufigsten Gründe sind, dass beim Erstellen eines Fremdschlüssels das Feld, auf das verwiesen wird, und das Fremdschlüsselfeld übereinstimmen müssen:

  • Engine sollte gleich sein z. InnoDB 
  • Datentyp sollte gleich sein und dieselbe Länge haben.
    z.B. VARCHAR (20) oder INT (10) UNSIGNED 
  • Sortierung sollte gleich sein. z.B. utf8 
  • Eindeutiger - Fremdschlüssel sollte sich auf ein Feld beziehen, das eindeutig ist (normalerweise privat) in der Referenztabelle.

Eine weitere Ursache für diesen Fehler ist:
Sie haben eine SET NULL-Bedingung definiert, obwohl einige Spalten als NOT NULL definiert sind.

59
Andrew

Möglicherweise haben Ihre dept_name-Spalten unterschiedliche Zeichensätze.

Sie könnten versuchen, eine oder beide davon zu ändern:

ALTER TABLE department MODIFY dept_name VARCHAR(20) CHARACTER SET utf8;
ALTER TABLE course MODIFY dept_name VARCHAR(20) CHARACTER SET utf8;
23
workflo
foreign key (dept_name) references department

Diese Syntax gilt nicht für MySQL. Es sollte stattdessen sein:

foreign key (dept_name) references department(dept_name)

MySQL erfordert, dass dept_name zweimal verwendet wird . Einmal zur Definition der Fremdspalte und einmal zur Definition der Primärspalte.

13.1.17.2. Verwenden von FOREIGN KEY-Einschränkungen

Die grundlegende Syntax für eine Fremdschlüsselbedingungsdefinition in einer CREATE TABLE- oder ALTER TABLE-Anweisung sieht folgendermaßen aus:

[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
ta.speot.is

FEHLER 1215 (HY000): Fremdschlüsseleinschränkung kann nicht hinzugefügt werden

Es ist auch erwähnenswert, dass Sie diese Fehlermeldung erhalten, wenn type der Spalte, die ein Fremdschlüssel in einem anderen Verzeichnis ist, nicht explizit mit der Spalte in der richtigen Tabelle übereinstimmt.

Zum Beispiel:

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

Dies liegt daran, dass das Feld student_id definiert wurde als:

mysql> desc schoolPersons;
+--------------------+------------+------+-----+---------+----------------+
| Field              | Type       | Null | Key | Default | Extra          |
+--------------------+------------+------+-----+---------+----------------+
| student_id         | bigint(20) | YES  |     | NULL    |                |

das Feld id in der Tabelle student wurde definiert als:

mysql> desc persons;
+--------------+----------------------+------+-----+-------------------+-----------------+
| Field        | Type                 | Null | Key | Default           | Extra           |
+--------------+----------------------+------+-----+-------------------+-----------------+
| id           | int(10) unsigned     | NO   | PRI | NULL              | auto_increment  |

bigint(20) (generiert aus Java long durch Ruhezustand) ist nicht kompatibel mit int(10) unsigned (Java int).

3
Gray

Es ist auch möglich, diesen Fehler zu erhalten, wenn der Fremdschlüssel kein Primärschlüssel in seiner eigenen Tabelle ist.

Ich habe eine ALTER TABLE erstellt und aus Versehen den Primärschlüsselstatus einer Spalte entfernt und diesen Fehler erhalten.

3
Jack Davidson

Ich treffe das Problem nicht als Sie. Aber ich erhalte die gleiche Fehlermeldung. Ich markiere es hier für die Überzeugung anderer.

Überprüfen Sie den Zeichensatz von zwei Tabellen, wenn der Spaltentyp char oder varchar ist. Ich benutze einen charset=gbk, aber ich erstelle eine neue Tabelle, deren Standardwert charset=utf8 ist. Der Zeichensatz ist also nicht derselbe.

ERROR 1215 (HY000): Cannot add foreign key constraint

Um es zu lösen, verwenden Sie den gleichen Zeichensatz. Zum Beispiel utf8.

2
g10guang

Fügen Sie einfach "unsigned" für die FOREIGN-Einschränkung hinzu

`FK` int(11) unsigned DEFAULT NULL,
1
vedavyasa

Der folgende Code hat für mich funktioniert

set @@foreign_key_checks=0;
ALTER TABLE  `table1` ADD CONSTRAINT `table1_fk1` FOREIGN KEY (`coloumn`) REFERENCES `table2` (`id`) ON DELETE CASCADE;
1

Ich sehe niemanden, der dies explizit angibt, und ich hatte dieselbe Fehlermeldung und mein Problem war, dass ich versuchte, einer TEMPORARY-Tabelle einen Fremdschlüssel hinzuzufügen. Welches ist nicht erlaubt als im Handbuch angegeben

Fremdschlüsselbeziehungen umfassen eine übergeordnete Tabelle, die die zentralen Datenwerte enthält, und eine untergeordnete Tabelle mit identischen Werten, die auf ihr übergeordnetes Element verweisen. Die FOREIGN KEY-Klausel wird in der untergeordneten Tabelle angegeben. Die übergeordneten und untergeordneten Tabellen müssen dieselbe Speicher-Engine verwenden. Sie dürfen keine temporären Tabellen sein.

(Hervorhebung meines)

0
EdgeCaseBerg

In meinem Fall war charset, datatype alles richtig. Nach einer Untersuchung stellte ich fest, dass in der übergeordneten Tabelle kein Index für die Fremdschlüsselspalte vorhanden war. Einmal hinzugefügt Problem wurde gelöst.

 enter image description here 

0
DEV

Ich bin auch auf das gleiche Problem gestoßen. Nicht sicher, warum dies funktioniert, aber es funktioniert tatsächlich: Fügen Sie nach Ihrer Erstellungsabfrage ENGINE INNODB hinzu.

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
Shiyao

Auch wenn dies nicht direkt mit Ihrer Situation verknüpft ist, kann es anderen Lesern helfen, festzustellen, dass Sie bei der Eingabe von show engine innodb mstatus genau die gleiche Fehlerausgabe erhalten, wenn Sie die Reihenfolge beim Erstellen der Datenbanktabellen nicht beachten. Das heißt, Sie dürfen keine Fremdeinschränkung hinzufügen, die auf eine Tabelle verweist, die noch nicht vorhanden ist. Die Referenztabelle muss vor der darauf befindlichen Tabelle vorhanden sein. 

Dies gilt auch, wenn die Reihenfolge der Tabellenerstellung beachtet wird, nicht jedoch die Spalten, die an der Fremdschlüsseleinschränkung beteiligt sind.

0
Begueradj

Beachten Sie, dass dieser Fehler auch auftreten kann, wenn die Zieltabelle oder -spalte, die Sie im Abschnitt REFERENCES verwenden, einfach nicht vorhanden ist.

0
Amalgovinus