Kann keine Fremdschlüsseleinschränkung hinzufügen - MySQL ERROR 1215 (HY000)

8

Ich versuche eine Datenbank für das Fitness-Studio-Management-System zu erstellen, aber ich kann nicht herausfinden, warum ich diesen Fehler bekomme. Ich habe versucht, hier nach der Antwort zu suchen, aber ich konnte es nicht finden.

%Vor%

Hier sind die übergeordneten Tabellen.

%Vor% Können Sie mir bei diesem Problem helfen? Danke.

    
dnuka 25.03.2015, 05:24
quelle

8 Antworten

19

Damit ein Feld als foreign key definiert wird, muss im übergeordneten Feld, auf das verwiesen wird, ein Index definiert sein.

Laut Dokumentation zu foreign key constraints:

  

REFERENCES parent_tbl_name (index_col_name, ...)

Definieren Sie eine INDEX für workouts.workoutName , paymentFor.paymentName bzw. supplements.supplementName . Und stellen Sie sicher, dass untergeordnete Spaltendefinitionen mit denen ihrer übergeordneten Spaltendefinitionen übereinstimmen müssen.

Ändern Sie workouts -Tabellendefinition wie folgt:

%Vor%

Ändern Sie supplements -Tabellendefinition wie folgt:

%Vor%

Ändern Sie paymentFor -Tabellendefinition wie folgt:

%Vor%

Ändern Sie nun die untergeordnete Tabellendefinition wie folgt:

%Vor%

Siehe :

  

[CONSTRAINT [Symbol]] FREMDSCHLÜSSEL
      [index_name] (index_col_name, ...)
      REFERENZEN tbl_name (index_col_name, ...)
      [ON DELETE reference_option]
      [ON UPDATE reference_option]

     

reference_option:
      BESCHRÄNKUNG | CASCADE | SET NULL | KEINE AKTION

    
Ravinder Reddy 25.03.2015, 06:13
quelle
25

Wenn Sie jemals herausfinden wollen, warum dieser Fehler aufgetreten ist, müssen Sie nur den folgenden Befehl ausführen und nach " NEUESTE AUSSENSCHLÜSSELFEHLER "

suchen

Befehl zum Ausführen: -

%Vor%

Sie werden den Grund für Ihre Fehler kennen.

    
John Cargo 29.05.2015 14:53
quelle
4

Fremdschlüssel sind eine Möglichkeit, Beziehungen / Einschränkungen zwischen Spalten in verschiedenen Tabellen zu implementieren.

Es gibt verschiedene Kategorien von Einschränkungen, die beeinflussen, wie sie erzwungen werden, wenn eine Zeile aus der übergeordneten Tabelle aktualisiert oder gelöscht wird:

Cascade : Wenn eine Zeile vom übergeordneten Element gelöscht wird, werden auch alle Zeilen in der untergeordneten Tabelle mit einem passenden FK-Wert gelöscht. Ähnlich für Änderungen des Werts in der übergeordneten Tabelle.

Restrict : Eine Zeile kann nicht aus der übergeordneten Tabelle gelöscht werden, wenn dadurch eine FK-Einschränkung mit der untergeordneten Tabelle aufgehoben würde. Ähnlich für Änderungen des Werts in der übergeordneten Tabelle.

No Action : Sehr ähnlich wie "Restrict", außer dass alle Ereignisse / Trigger in der übergeordneten Tabelle ausgeführt werden, bevor die Einschränkung erzwungen wird. Dadurch erhält der Anwendungs-Writer die Option, alle FK-Constraint-Konflikte mithilfe einer gespeicherten Prozedur aufzulösen.

Set NULL : Wenn NULL ein zulässiger Wert für die FK-Spalte in der untergeordneten Tabelle ist, wird er auf NULL gesetzt, wenn die zugehörigen Daten in der übergeordneten Tabelle aktualisiert oder gelöscht werden.

Set Default : Wenn es einen Standardwert für die FK-Spalte in der untergeordneten Tabelle gibt, wird diese verwendet, wenn die zugehörigen Daten in der übergeordneten Tabelle aktualisiert oder gelöscht werden. Beachten Sie, dass dies in dieser Version nicht implementiert ist. Die Einschränkung kann dem Schema hinzugefügt werden, aber ein nachfolgendes Löschen oder Aktualisieren der Spalte in der übergeordneten Tabelle schlägt fehl.

    
user4757271 07.04.2015 05:46
quelle
3

Manchmal wird der Fehler "# 1215 - Fremdschlüssel-Integritätsbedingung nicht hinzufügen" wegen der Fehlertabelle der Tabelle TYPE (InnoDB, MyISAM, ..) angezeigt.

Ändern Sie also den Tabellentyp in selbe und versuchen Sie, die Fremdschlüsseleinschränkung anzuwenden

mysql> ALTER TABLE table_name ENGINE=InnoDB;

mysql> ALTER TABLE Orders ADD FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)

    
kadhiresan k 09.12.2016 08:00
quelle
2

Dies könnte für einige Leute funktionieren. Fügen Sie einfach den Standardzeichensatz als utf8

hinzu %Vor%     
edem 11.12.2017 12:18
quelle
1

Ich habe den gleichen Fehler bekommen. Der Grund war, dass ich mich auf eine Spalte in einer Tabelle bezog, die mit dem Zeichensatz utf8 aus einer Tabelle erstellt wurde, die mit dem Zeichensatz latin erstellt wurde.

Die Tabellen, die mit dem mySQL-Workbench create table-Dienstprogramm erstellt wurden, haben den Standardzeichensatz latin.

Eine einfache Vorgehensweise, um dies herauszufinden, wenn Sie Workbench verwenden, ist das Anzeigen der Tabelle create-Anweisung einer beliebigen Tabelle. Sie werden am Ende die Standardzeichenfolge haben.

    
Divije Narasimhachar 03.03.2017 06:25
quelle
0

Ich beantworte die obige Frage nicht, sondern nur für Leute, die auf denselben mysql-Fehler stoßen werden.

Ich habe nur die referenzierte Tabellen-Engine in innodb geändert.

    
Peter 18.10.2016 09:53
quelle
0

Ich stoße auf diesen Fehler. Ich füge eine Fremdschlüsseleinschränkung für eine Spalte hinzu, die eine 'not null constraint' hat, aber ich habe 'on delete set null' in der Fremdbedingung angegeben. Dies ist ein Widerspruch, der auf den ersten Blick nicht offensichtlich ist.

Hier sind meine zwei Tabellen:

%Vor%

Wenn Sie die Einschränkung NOT NULL für die Spalte study_id in der Tabelle client_study entfernen, kann der Fremdschlüssel hinzugefügt werden. Die andere Alternative besteht darin, die Nicht-NULL-Einschränkung für die Tabelle client_table beizubehalten, aber die Definition des Fremdschlüssels in die Einstellung delete no action oder andere Optionen zu ändern.

    
Kemin Zhou 14.03.2018 00:45
quelle

Tags und Links