Ich entwerfe nicht jeden Tag Schemata, aber wenn ich das tue, versuche ich, Kaskadenaktualisierungen / -löschungen korrekt einzurichten, um die Verwaltung zu vereinfachen. Ich verstehe, wie Kaskaden funktionieren, aber ich kann mich nie erinnern, welcher Tisch welcher ist.
Wenn ich zum Beispiel zwei Tabellen habe - Parent
und Child
- mit einem Fremdschlüssel auf Child
diesen Referenzen Parent
und ON DELETE CASCADE
welche Datensätze lösen eine Kaskade aus und welche Datensätze werden von der Kaskade gelöscht? Meine erste Vermutung wäre, dass die Child
Datensätze gelöscht werden, wenn Parent
Datensätze gelöscht werden, da Child
Datensätze von Datensätzen abhängen Parent
, aber das ON DELETE
ist mehrdeutig; es könnte das bedeuten löschen Parent
Datensatz , wenn der Child
Datensatz gelöscht wird, oder es könnte das bedeuten löschen Child
Datensatz , wenn die Parent
gelöscht wird. Also was ist es?
Ich wünschte, die Syntax wäre ON PARENT DELETE, CASCADE
, ON FOREIGN DELETE, CASCADE
oder etwas ähnliches, um die Mehrdeutigkeit zu beseitigen. Hat jemand irgendwelche Mnemonics, um sich daran zu erinnern?
quelle
Order(custID, itemID, orderID)
DabeicustID
bezieht sich auf einen Primärschlüssel in derCustomers
Tabelle unditemID
auf einen Primärschlüssel in derItems
Tabelle. Werden nichtOrder
zwei Eltern haben?ON DELETE CASCADE ist eine optionale Klausel in einer Fremdschlüsseldeklaration. So geht es mit der Fremdschlüsseldeklaration. (Bedeutet, in der "Kind" -Tabelle.)
Eine Möglichkeit, eine Fremdschlüsseldeklaration zu interpretieren, ist "Alle gültigen Werte für diese Spalte stammen aus 'that_column' in 'that_table'." Wenn Sie eine Zeile in der Tabelle "child" löschen, kümmert sich niemand darum. Die Datenintegrität wird nicht beeinträchtigt.
Wenn Sie eine Zeile aus der "übergeordneten" Tabelle - aus "that_table" - löschen, entfernen Sie einen gültigen Wert aus den möglichen Werten für die "untergeordnete" Tabelle. Um die Datenintegrität zu erhalten, müssen Sie tun etwas zum „Kind“ Tabelle. Das Kaskadieren von Löschvorgängen ist eine Sache, die Sie tun können.
quelle
SQL: 2011 Spec
Es gibt fünf Optionen für
ON DELETE
, undON UPDATE
das kann auf die zutreffenFOREIGN KEY
. Diese werden<referential actions>
direkt aus der SQL: 2011-Spezifikation aufgerufenDer Fremdschlüssel stellt die abhängige Beziehung her. Das
<referential action>
bestimmt, was passiert, wenn die Beziehung aufgelöst wird.Beispiel / Metapher / Erklärung
In diesem Beispiel werden wir das gemeinsame Modell von Gesellschaft und Wirtschaft akzeptieren: Jedes
business
Unternehmen unterhält eine Beziehung zu denbourgeoisie
durch afatcat_owner
.Wenn alle
business
es von direkt betroffen sindbourgeoisie
durch ihrefatcat_owner
dann was tun Sie , nachdem die Arbeiterrevolution , als dass Sie die Säuberungfatcat_owner
s und haben eine klassenlose Gesellschaft?Sie haben hier ein paar Möglichkeiten,
RESTRICT
. Einige Leute glauben, dass dies das geringere Übel ist, aber sie irren sich normalerweise.Lass es weitergehen. Wenn ja, wenn die Revolution passiert, gibt Ihnen SQL vier Möglichkeiten,
SET NULL
-- frei lassen. Wer weiß, vielleicht wird der Kapitalismus wiederhergestelltbourgeoisie
, und Oligarchen füllen die Rolle derfatcat_owners
. Wichtiger Hinweis, die Spalte mussNULLABLE
(nichtNOT NULL
) sein, sonst kann das nie passieren.SET DEFAULT
- Vielleicht hattest du einenDEFAULT
, der das erledigt hat? ADEFAULT
kann eine Funktion aufrufen. Vielleicht ist Ihr Schema bereits revolutionär.CASCADE
- Es gibt keine Schadensbegrenzung. Wenn dasbourgeoisie
geht, geht das auchbusiness
. Wenn ein Unternehmen muss eine hatfatcat_pig
, dann manchmal ist es sinnvoller , die Daten zu verlieren lieber als ein nicht-Geschäft in einerbusiness
Tabelle.NO ACTION
- Dies ist im Wesentlichen eine Methode, um die Überprüfung zu verzögern. In MySQL ist dies nicht anders alsRESTRICT
in PostgreSQLIn einem solchen System wird die Einschränkung erst validiert, bevor die Transaktion festgeschrieben wird. Dies kann dazu führen, dass die Revolution abgebrochen wird, Sie können sich jedoch in der Transaktion erholen - für einen gewissen Grad an "Wiederherstellung".
quelle
referenced
Tabelle übergeordnete Tabelle undreferencing
Tabelle untergeordnete Tabelle?Eine einfache Gedächtnisstütze wäre
ON DELETE des übergeordneten CASCADE [durch Löschen] hier
Hier erfahren Sie, welche Löschvorgänge (Löschvorgänge des übergeordneten Elements) kaskadiert werden, wohin die Anweisung ON DELETE CASCADE (für das untergeordnete Element ) wechselt und was gelöscht wird (für das untergeordnete Element ).
quelle
Nun, vielleicht können wir die Syntax rationalisieren. Nehmen wir ein Python-Beispiel:
Was in dieser Zeile steht, ist on_delete des übergeordneten Elements (was in der Anweisung versehentlich erwähnt wird). Bitte kaskadieren Sie die Löschung auf das untergeordnete Element. Aus diesem Grund wird die CASCADE-Anweisung auf untergeordneter Ebene definiert und markiert diejenigen untergeordneten Elemente, die gelöscht werden müssen
Zum Beispiel, wenn Sie eine andere Klasse hatten
Diese Struktur würde deutlich machen, welches der Kinder entfernt werden muss (Child) und welches bleiben soll (GrownUpChild), obwohl es verwaist ist
[Bearbeiten: In Anbetracht des Diskussionskontexts, insbesondere in Fällen von on_delete = models.CASCADE usw.] ist es häufig erwünscht, Kinder eines gelöschten Elternteils zu lassen, und zwar aus Gründen der Überwachung und Berichterstattung sowie aus Gründen der Wiederherstellung aus Versehen Streichungen. [Natürlich wird Software auf Unternehmensebene um dieses Verhalten herum entwickelt und gelöschte Datensätze als gelöscht = 1 markieren, anstatt sie tatsächlich zu löschen, und sie werden auch nicht in Abfragen für das Front-End enthalten sein, abzüglich einiger speziell gestalteter Berichte. Außerdem werden die gelöschten == 1-Datensätze aus der Datenbank entfernt, was normalerweise vom Benutzeroberflächenadministrator ausgeführt wird, wobei häufig eine Beteiligung des Datenbankadministrators vermieden wird.]
quelle