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
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_name
VARCHAR(20)
sein.
Weitere Informationen finden Sie in der MySQL-Dokumentation
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:
Eine weitere Ursache für diesen Fehler ist:
Sie haben eine SET NULL-Bedingung definiert, obwohl einige Spalten als NOT NULL definiert sind.
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;
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
- oderALTER 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
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
).
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.
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
.
Fügen Sie einfach "unsigned" für die FOREIGN-Einschränkung hinzu
`FK` int(11) unsigned DEFAULT NULL,
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;
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)
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;
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.
Beachten Sie, dass dieser Fehler auch auftreten kann, wenn die Zieltabelle oder -spalte, die Sie im Abschnitt REFERENCES verwenden, einfach nicht vorhanden ist.