Ich habe zwei Tabellen in MySQL database- parent
, child
. Ich versuche, meiner untergeordneten Tabelle Fremdschlüsselverweise hinzuzufügen, die auf der übergeordneten Tabelle basieren. Gibt es einen signifikanten Unterschied zwischen ON UPDATE CASCADE
und?ON DELETE CASCADE
Mein Elterntisch
CREATE TABLE parent (
id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;
Meine Frage ist: Was ist der Unterschied zwischen den folgenden SQL-Abfragen.
ON DELETE CASCADE
CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ) ENGINE=INNODB;
ON UPDATE CASCADE
CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON UPDATE CASCADE ) ENGINE=INNODB;
ON UPDATE CASCADE ON DELETE CASCADE
CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON UPDATE CASCADE ON DELETE CASCADE ) ENGINE=INNODB;
Gibt es irgendwelche Fehler in den Abfragen? Was bedeuten diese Abfragen (1,2 & 3)? Sind sie gleich ???
mysql
innodb
mysql-5.5
foreign-key
Einsamer Wolf
quelle
quelle
Antworten:
Ein sehr guter Thread zu diesem Thema ist hier und auch hier zu finden . Die endgültige Anleitung für MySQL ist natürlich die Dokumentation, die hier zu finden ist .
Im SQL 2003-Standard gibt es 5 verschiedene Referenzaktionen:
Um die Frage zu beantworten:
KASKADE
ON DELETE CASCADE
bedeutet, dass beim Löschen des übergeordneten Datensatzes auch alle untergeordneten Datensätze gelöscht werden. Dies ist meiner Meinung nach keine gute Idee. Sie sollten alle Daten, die sich jemals in einer Datenbank befunden haben, im Auge behalten, obwohl dies mitTRIGGER
s möglich ist. (Siehe jedoch Vorbehalt in den Kommentaren unten).ON UPDATE CASCADE
bedeutet, dass sich der untergeordnete Wert ändert, wenn der übergeordnete Primärschlüssel geändert wird, um dies widerzuspiegeln. Wieder meiner Meinung nach keine gute Idee. Wenn SiePRIMARY KEY
s regelmäßig (oder sogar überhaupt!) Ändern , stimmt etwas nicht mit Ihrem Design. Siehe auch hier Kommentare.ON UPDATE CASCADE ON DELETE CASCADE
bedeutet, dass, wenn SieUPDATE
ODERDELETE
das übergeordnete Element auswählen, die Änderung an das untergeordnete Element weitergeleitet wird. Dies entsprichtAND
den Ergebnissen der ersten beiden Aussagen.BESCHRÄNKEN
RESTRICT
bedeutet, dass jeder Versuch, das übergeordnete Element zu löschen und / oder zu aktualisieren, fehlschlägt und einen Fehler auslöst. Dies ist das Standardverhalten für den Fall, dass eine referenzielle Aktion nicht explizit angegeben wird.KEINE AKTION
NO ACTION
: Aus dem Handbuch . Ein Schlüsselwort aus Standard-SQL. In MySQL entsprichtRESTRICT
. Der MySQL Server lehnt den Lösch- oder Aktualisierungsvorgang für die übergeordnete Tabelle ab, wenn die referenzierte Tabelle einen zugehörigen Fremdschlüsselwert enthält. Einige Datenbanksysteme haben verzögerte Prüfungen und esNO ACTION
handelt sich um eine verzögerte Prüfung. In MySQL werden Fremdschlüsseleinschränkungen sofort überprüft,NO ACTION
genauso wie inRESTRICT
.SET NULL
SET NULL
- wieder aus dem Handbuch. Löschen oder aktualisieren Sie die Zeile aus der übergeordneten Tabelle und setzen Sie die Fremdschlüsselspalte (n) in der untergeordneten Tabelle aufNULL
. Dies ist meiner Meinung nach nicht die beste Idee, vor allem, weil es keine Möglichkeit zum "Zeitreisen" gibt - dh Rückblick auf die untergeordneten Tabellen und Zuordnen von Datensätzen zuNULL
s zum entsprechenden übergeordneten Datensatz -CASCADE
oder umTRIGGER
Protokollierungstabellen zum Verfolgen mit s zu füllen Änderungen (siehe aber Kommentare).STANDARD EINSTELLEN
SET DEFAULT
. Ein weiterer (möglicherweise sehr nützlicher) Teil des SQL-Standards, den MySQL nicht implementiert hat! Ermöglicht dem Entwickler, einen Wert anzugeben, auf den die Fremdschlüsselspalte (n) bei einem UPDATE oder einem DELETE festgelegt werden sollen. InnoDB und NDB lehnen Tabellendefinitionen mit einerSET DEFAULT
Klausel ab.Wie oben erwähnt, sollten Sie sich hier ein wenig mit der Dokumentation befassen .
quelle
Diese beiden Aktionen müssen ausgeführt werden, wenn der Datensatz, auf den verwiesen wird, in der übergeordneten Tabelle seine ID ändert und wenn er gelöscht wird.
Wenn Sie ausführen:
Und es gibt mindestens einen Datensatz auf
child
mitparent_id = 1
, 1) wird fehlschlagen; In den Fällen 2) und 3) werden alle Datensätze mit parent_id = 1 auf parent_id = -1 aktualisiert.Wenn Sie ausführen:
Und es gibt mindestens einen Datensatz auf
child
mitparent_id = 1
, 2) wird fehlschlagen; In den Fällen 1) und 3) werden alle Datensätze mitparent_id = 1
gelöscht.3) ist syntaktisch korrekt.
Die vollständige Dokumentation finden Sie im Handbuch .
quelle
Ich habe nicht genug Ansehen, um die vorherigen Antworten zu kommentieren. Also dachte ich, ich würde etwas näher darauf eingehen.
1) ON DELETE CASCADE bedeutet, dass beim Löschen des übergeordneten Datensatzes auch alle referenzierenden untergeordneten Datensätze gelöscht werden. ON UPDATE ist standardmäßig RESTRICT, was bedeutet, dass das UPDATE im übergeordneten Datensatz fehlschlägt.
2) Die Standardeinstellung für die Aktion ON DELETE ist RESTRICT. Dies bedeutet, dass das Löschen im übergeordneten Datensatz fehlschlägt. ON UPDATE CASCADE aktualisiert alle referenzierenden untergeordneten Datensätze, wenn der übergeordnete Datensatz aktualisiert wird.
3) Siehe die CASCADE-Aktionen in 1) und 2) oben.
Übergeordnete Datensatz-IDs als Fremdschlüssel (in untergeordneten Tabellen) verwenden - Erfahrungsgemäß werden a) automatisch generierte Folgenummern NICHT als Fremdschlüssel verwendet. Verwenden Sie stattdessen einen anderen eindeutigen übergeordneten Schlüssel. b) Wenn die IDs GUIDs sind, ist es in Ordnung, sie als Fremdschlüssel zu verwenden. Sie werden die Weisheit in diesem Vorschlag sehen, wenn Sie die Datensätze exportieren und importieren oder in eine andere Datenbank kopieren. Es ist zu umständlich, mit automatisch generierten Sequenznummern während der Datenmigration umzugehen, wenn sie als Fremdschlüssel referenziert werden.
quelle