Wie funktionieren die Postgres Fremdschlüssel ‚auf Update‘ und ‚auf löschen‘ Optionen funktionieren?

StackOverflow https://stackoverflow.com/questions/225881

Frage

Kann mir jemand eine klare Erklärung / Beispiel dafür, was diese Funktionen zu tun, und wenn es angebracht ist, sie zu benutzen?

War es hilfreich?

Lösung

Gerade von der manuellen ...

  

Wir wissen, dass die Fremdschlüssel Anlegen von Aufträgen nicht zulassen, die auf Produkte beziehen sich nicht. Was aber, wenn ein Produkt nach einer Bestellung entfernt wird erstellt, dass Verweise darauf? SQL ermöglicht es Ihnen, das auch zu handhaben. Intuitiv, wir haben ein paar Optionen:

     

Verbieten eine referenzierte Produkt löschen

     

als auch die Aufträge löschen

     

Etwas anderes?

CREATE TABLE order_items (
 product_no integer REFERENCES products ON DELETE RESTRICT,
 order_id integer REFERENCES orders ON DELETE CASCADE,
 quantity integer,
 PRIMARY KEY (product_no, order_id)
);
  

Die Beschränkung und Löschweiter sind die beiden am häufigsten verwendeten Optionen. RESTRICT verhindert das Löschen eines referenzierten Reihe. NO ACTION bedeutet, dass, wenn eine Referenzierung Zeilen noch vorhanden ist, wenn die Randbedingung überprüft wird, wird ein Fehler ausgelöst; Dies ist das Standardverhalten, wenn Sie nichts angeben. (Der wesentliche Unterschied zwischen diesen beiden Möglichkeiten ist, dass NO ACTION die Prüfung erst später in der Transaktion aufgeschoben werden kann, während nicht einschränkt.) CASCADE gibt an, dass, wenn eine referenzierte Zeile gelöscht wird, Zeile (n) verweist sie automatisch gelöscht werden soll auch. Es gibt zwei weitere Optionen: SET NULL und SET DEFAULT. Dieses bewirkt, dass die Referenzierung Spalten nulls oder Standardwerte festgelegt werden, die jeweils, wenn die referenzierten Zeile gelöscht wird. Beachten Sie, dass diese keine entschuldigen Sie sich nicht von irgendwelchen Einschränkungen zu beobachten. Wenn zum Beispiel eine Aktion gibt SET DEFAULT aber der Standardwert würde die Fremdschlüssel nicht erfüllt, wird der Vorgang fehlschlagen.

     

Analog zu ON DELETE auch ON UPDATE ist, die aufgerufen wird, wenn eine referenzierte Spalte geändert (aktualisiert). Die möglichen Aktionen sind die gleichen.

Bearbeiten Sie können einen Blick auf diese Frage im Zusammenhang nehmen wollen: Wann / Warum Cascading in SQL Server verwenden? . Die Konzepte hinter der Frage / Antworten sind die gleichen.

Andere Tipps

Ich habe eine PostgreSQL-Datenbank und ich verwende auf Löschen, wenn ich einen Benutzer, die ich aus der Datenbank löschen und ich brauche löschen es Informationen aus anderem Tisch. Diese Möglichkeiten, ich brauche nur 1 löschen und FK, die auf Löschen zu tun hat, werden Informationen aus anderen Tabelle löschen.

Sie können das gleiche mit ON-Update tun. Wenn Sie die Tabelle und das Feld aktualisieren hat ein FK mit On-Update, wenn eine Änderung an der FK wird Sie auf der FK-Tabelle festgestellt werden.

Was Daok sagt, ist wahr ... es kann sehr bequem sein. Auf der anderen Seite, passieren Dinge in der Datenbank automatisch mit kann ein echtes Problem sein, besonders wenn es um die Beseitigung von Daten kommt. Es ist möglich, dass in Zukunft jemand sich darauf verlassen, wird das FKs in der Regel Streichung von Eltern verhindern, wenn Kinder da sind und nicht erkennen, dass die Nutzung von On Cascade Löschen nicht nur nicht daran hindert, Löschung, es macht große Mengen an Daten in Dutzenden von andere Tische gehen weg durch einen Wasserfall von Cascading löscht.

@ Arthur Kommentar.

Je häufiger „versteckt“ Dinge passieren in der Datenbank desto weniger wahrscheinlich ist es, dass jemand jemals einen guten Griff haben wird auf das, was vor sich geht. Auslöser (und dies ist im Wesentlichen ein Trigger) kann meine einfache Wirkung Löschen einer Zeile, verursachen breit haben Konsequenzen während meiner Datenbank reichen. Ich gebe eine DELETE-Anweisung und 17 Tabellen sind betroffen mit Kaskaden von Triggern und Einschränkungen und nichts davon ist unmittelbar an den Emittenten des Befehls offensichtlich. OTOH, Wenn ich die Löschung der Eltern und all ihre Kinder in einem Verfahren stelle dann ist es sehr einfach und klar für jedermann zu sehen, genau das, was passieren wird, wenn ich den Befehl ausgeben.

Es hat absolut nichts damit zu tun, wie gut ich eine Datenbank entwerfen. Es hat alles mit den operativen Ausgaben von Triggern eingeführt zu tun.

Anstatt das Verfahren zum Schreiben die ganze Arbeit zu tun, der Kaskade löschen oder die Kaskade zu aktualisieren, können Sie einfach eine Warnmeldung schreiben statt. Viel einfacher als das Rad neu zu erfinden, und es macht deutlich, an den Client (und neue Entwickler den Code Abholung)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top