2016-03-26 13 views
1

Mir ist nicht klar, was passiert, wenn eine "Fremdschlüsseleinschränkung" mit der Option CASCADE gelöscht wird.CASCADE-Verhalten beim Löschen eines Fremdschlüssels

Betrachten wir zum Beispiel diesen Befehl

ALTER TABLE table1 DROP CONSTRAINT foreignKeyToTable2 CASCADE. 

Was die Option CASCADE soll in diesem Fall tun? Was würde passieren, wenn ich es auslasse? Und wenn ich RESTRICT anstelle von CASCADE geschrieben habe?

Hinweis: Dieses Beispiel der Abfrage ist Auszug aus "Ramez Elmasri, Shamkant B. Navathe - Grundlagen der Datenbanksysteme, Ende des Kapitels 5".

+0

Ich denke, zu erklären, wie Fremdschlüssel funktionieren, ist eine zu breite Frage. Die Datenbank-Dokumentation deckt das normalerweise gut ab, und die Ideen sind in den Datenbanken ziemlich gleich. Hier ist die MySQL-Dokumentation: https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html. –

+0

Welches DBMS benutzen Sie? –

+0

@GordonLinoff Ich habe untersucht, wie Fremdschlüssel funktioniert, aber ich kann nicht herausfinden, was das Schlüsselwort CASCADE löschen soll. Ich meine, wenn ich einen Fremdschlüssel aus Tabelle1 mit Verweis auf Tabelle2 erzeuge und dann Tabelle2 mit dem Schlüsselwort CASCADE lösche, wird der Fremdschlüssel gelöscht. Wenn ich ein DBMS wäre, würde ich nichts nach der Ausführung löschen den Befehl ALTER TABLE tabelle1 DROP CONSTRAINT foreignKeyToTable2 CASCADE. – Nisba

Antwort

3

Die cascade Option zum Löschen einer Abhängigkeit wird nur benötigt, wenn primäre Schlüssel fallen gelassen werden, nicht beim Löschen eines Fremdschlüssels.

dieses Beispiel in Postgres Bedenken Sie:

create table t1 (id integer, constraint pk_one primary key (id)); 
create table t2 (id integer primary key, id1 integer references t1); 

Wenn Sie versuchen, auszuführen:

alter table t1 drop constraint pk_one; 

Sie erhalten:

ERROR: cannot drop constraint pk_one on table t1 because other objects depend on it 
    Detail: constraint t2_id1_fkey on table t2 depends on index pk_one 
    Hint: Use DROP ... CASCADE to drop the dependent objects too. 

Wenn Sie laufen:

alter table t1 drop constraint pk_one cascade; 

erhalten Sie:

NOTICE: drop cascades to constraint t2_id1_fkey on table t2 

Telling Sie, dass der Fremdschlüssel, der den Primärschlüssel benötigt wurde ebenfalls gelöscht.


Beachten Sie, dass nicht alle DBMS eine Kaskadierung unterstützen. Postgres und Oracle tun es.
MySQL, SQL Server oder Firebird nicht. Sie müssen die Fremdschlüssel in diesen DBMS manuell löschen.

+0

Danke! Also das Beispiel im Buch war falsch! – Nisba

+0

@LucaMarconato. Die Syntax ist für Postgres und Oracle korrekt.Es ist nur nicht notwendig, wenn Sie einen Fremdschlüssel löschen. –

+0

Vielen Dank für die Erklärung der "Drop Cascaden zu Constraint" – tuxayo