Ich bin generell vorsichtig bei kaskadierten Löschvorgängen (und anderen automatischen Aktionen, die Daten löschen oder beschädigen könnten), entweder über Trigger oder ON <something> CASCADE
. Solche Einrichtungen sind sehr leistungsfähig, aber auch potenziell gefährlich.
- Ist das kaskadierende Löschen hier eine richtige Wahl?
Es würde sicherlich das tun, wonach Sie suchen: Entfernen Sie verwandte Datensätze, wenn ein übergeordneter Datensatz entfernt wird, ohne dass Sie eine andere Logik implementieren müssen, um sicherzustellen, dass Kinder zuerst entfernt werden, wodurch Ihr Code präziser wird. Alle Aktionen werden in eine implizite Transaktion eingeschlossen. Wenn also etwas blockiert, löscht das Kind die gesamte Operation, wodurch die referenzielle Integrität mit geringem oder keinem zusätzlichen Codierungsaufwand aufrechterhalten wird.
Stellen Sie sicher, dass Ihre Verwendung von kaskadierten Löschvorgängen und anderen Aktionen "hinter den Kulissen" gut dokumentiert ist, damit zukünftige Systembetreuer sich dessen voll bewusst sind.
- Wann sollte kaskadierende Detele nicht verwendet werden?
Es sollte nicht verwendet werden, wenn Sie wie ich paranoid sind! Ein wichtiger Punkt, den Sie berücksichtigen sollten, sind die anderen Entwickler, die derzeit oder in Zukunft an Ihrem Code / Ihrer Datenbank arbeiten (daher der obige Kommentar zur Dokumentation "versteckter" Verhaltensweisen).
Es ist ganz in meiner Erfahrung gemeinsam für unerfahrene Menschen zu verwenden , DELETE
dann re- INSERT
zu aktualisieren , um Reihen, vor allem , wenn , was sie wirklich wollen , ist ein MERGE
/ UPSERT
Betrieb (Update vorhandene Zeilen und neue zu schaffen , in der eine Zeile mit einem bestimmten Schlüssel nicht existiert) und das DBMS unterstützt Merge / Upsert nicht (oder sie wissen nichts von seiner Unterstützung). Ohne kaskadierte Aktionen ist dies absolut sicher (oder es tritt ein Fehler auf, wenn die Datenintegrität gefährdet wird), aber wenn jemand dies für Zeilen in einer übergeordneten Tabelle tut, in denen verweisende FKs vorhanden sindON DELETE CASCADE
Wenn dann festgelegt wird, werden verwandte Daten als Ergebnis des anfänglichen Löschens gelöscht und nicht ersetzt - so gehen Daten verloren (nicht, dass die Kaskade mit dem Löschvorgang stattfindet, selbst wenn das Löschen und das anschließende Einfügen in explizite Transaktionen eingeschlossen sind - dies wird nicht der Fall sein Warten Sie ab, ob die Transaktion die Zeilen in der übergeordneten Tabelle in nachfolgenden Anweisungen ersetzt.) Die Kaskade kann über andere Beziehungsschiffe fortgesetzt werden (z. B. Löschen eines leitenden Vorgesetzten, Löschen seines Teams durch Kaskade, Löschen der Teams seiner Teams durch Kaskade). Alle verfolgten Datensätze für all diese Personen werden durch Kaskade gelöscht, ...). Ohne aktivierte Kaskadierung würde hier nur ein Fehler angezeigt, anstatt dass die Daten stillschweigend verloren gehen.