5.4. Einschränkungen (2023)

5.4.1. Überprüfen Sie die Einschränkungen
5.4.2. Nicht-Null-Einschränkungen
5.4.3. Einzigartige Einschränkungen
5.4.4. Primärschlüssel
5.4.5. Fremde Schlüssel
5.4.6. Ausschlussbeschränkungen

Datentypen sind eine Möglichkeit, die Art der Daten einzuschränken, die in einer Tabelle gespeichert werden können. Für viele Anwendungen ist die Einschränkung, die sie bieten, jedoch zu grob. Beispielsweise sollte eine Spalte mit einem Produktpreis wahrscheinlich nur positive Werte akzeptieren. Es gibt jedoch keinen Standarddatentyp, der nur positive Zahlen akzeptiert. Ein weiteres Problem besteht darin, dass Sie möglicherweise Spaltendaten in Bezug auf andere Spalten oder Zeilen einschränken möchten. In einer Tabelle mit Produktinformationen sollte es beispielsweise nur eine Zeile für jede Produktnummer geben.

Zu diesem Zweck ermöglicht Ihnen SQL, Einschränkungen für Spalten und Tabellen zu definieren. Einschränkungen geben Ihnen so viel Kontrolle über die Daten in Ihren Tabellen, wie Sie möchten. Wenn ein Benutzer versucht, Daten in einer Spalte zu speichern, die gegen eine Einschränkung verstoßen würden, wird ein Fehler ausgelöst. Dies gilt auch dann, wenn der Wert aus der Standardwertdefinition stammt.

5.4.1.Überprüfen Sie die Einschränkungen

Eine Check-Einschränkung ist der allgemeinste Einschränkungstyp. Damit können Sie angeben, dass der Wert in einer bestimmten Spalte einem booleschen Ausdruck (Wahrheitswert) genügen muss. Um beispielsweise positive Produktpreise zu fordern, könnten Sie Folgendes verwenden:

TABELLE ERSTELLEN Produkte (Produktnummer Ganzzahl, Namenstext, Preis numerischCHECK (Preis > 0));

Wie Sie sehen, folgt die Einschränkungsdefinition genau wie Standardwertdefinitionen dem Datentyp. Standardwerte und Einschränkungen können in beliebiger Reihenfolge aufgelistet werden. Eine Check-Einschränkung besteht aus dem SchlüsselwortÜBERPRÜFENgefolgt von einem Ausdruck in Klammern. Der Check-Constraint-Ausdruck sollte die auf diese Weise eingeschränkte Spalte einbeziehen, andernfalls würde die Einschränkung keinen allzu großen Sinn ergeben.

Sie können der Einschränkung auch einen separaten Namen geben. Dadurch werden Fehlermeldungen verdeutlicht und Sie können auf die Einschränkung zurückgreifen, wenn Sie sie ändern müssen. Die Syntax lautet:

TABELLE ERSTELLEN Produkte (Produktnummer Ganzzahl, Namenstext, Preis numerischCONSTRAINT positiver_PreisCHECK (Preis > 0));

Um also eine benannte Einschränkung anzugeben, verwenden Sie das SchlüsselwortZWANGgefolgt von einem Bezeichner, gefolgt von der Einschränkungsdefinition. (Wenn Sie auf diese Weise keinen Einschränkungsnamen angeben, wählt das System einen Namen für Sie.)

Ein Check-Constraint kann sich auch auf mehrere Spalten beziehen. Angenommen, Sie hinterlegen einen regulären Preis und einen ermäßigten Preis und möchten sicherstellen, dass der ermäßigte Preis niedriger als der reguläre Preis ist:

CREATE TABLE Produkte ( Produktnummer Ganzzahl, Namenstext, Preis numerisch CHECK (Preis > 0), discounted_price numerisch CHECK (discounted_price > 0),CHECK (Preis > Discounted_price));

Die ersten beiden Einschränkungen dürften bekannt vorkommen. Der dritte verwendet eine neue Syntax. Es ist keiner bestimmten Spalte zugeordnet, sondern erscheint als separates Element in der durch Kommas getrennten Spaltenliste. Spaltendefinitionen und diese Einschränkungsdefinitionen können in gemischter Reihenfolge aufgelistet werden.

Wir sagen, dass es sich bei den ersten beiden Einschränkungen um Spalteneinschränkungen handelt, während es sich bei der dritten um eine Tabelleneinschränkung handelt, da sie getrennt von jeder Spaltendefinition geschrieben wird. Spalteneinschränkungen können auch als Tabelleneinschränkungen geschrieben werden, obwohl das Umgekehrte nicht unbedingt möglich ist, da sich eine Spalteneinschränkung nur auf die Spalte beziehen soll, der sie zugeordnet ist. (PostgreSQLerzwingt diese Regel nicht, aber Sie sollten sie befolgen, wenn Sie möchten, dass Ihre Tabellendefinitionen mit anderen Datenbanksystemen funktionieren.) Das obige Beispiel könnte auch wie folgt geschrieben werden:

CREATE TABLE products (product_no integer, name text, price numeric, CHECK (price > 0), discounted_price numeric, CHECK (discounted_price > 0), CHECK (price > discounted_price));

oder auch:

CREATE TABLE products (product_no integer, name text, price numeric CHECK (price > 0), discounted_price numeric, CHECK (discounted_price > 0 AND price > discounted_price));

Es ist Geschmackssache.

Namen können Tabellen-Constraints auf die gleiche Weise zugewiesen werden wie Spalten-Constraints:

CREATE TABLE Produkte (Produktnummer Ganzzahl, Namenstext, Preis numerisch, CHECK (Preis > 0), discounted_price numerisch, CHECK (discounted_price > 0),CONSTRAINT gültiger_RabattCHECK (Preis > Discounted_Price));

Es ist zu beachten, dass eine Prüfeinschränkung erfüllt ist, wenn der Prüfausdruck „true“ oder den Nullwert ergibt. Da die meisten Ausdrücke den Nullwert ergeben, wenn ein Operand null ist, verhindern sie keine Nullwerte in den eingeschränkten Spalten. Um sicherzustellen, dass eine Spalte keine Nullwerte enthält, kann die im nächsten Abschnitt beschriebene Nicht-Null-Einschränkung verwendet werden.

(Video) 5.4 Dimensionen und Klassifizierungen der #Menschenrechte

Notiz

PostgreSQLunterstützt nichtÜBERPRÜFENEinschränkungen, die auf andere Tabellendaten als die neue oder aktualisierte Zeile verweisen, die überprüft wird. Während einÜBERPRÜFENObwohl eine Einschränkung, die gegen diese Regel verstößt, in einfachen Tests scheinbar funktioniert, kann nicht garantiert werden, dass die Datenbank nicht einen Zustand erreicht, in dem die Einschränkungsbedingung falsch ist (aufgrund nachfolgender Änderungen der anderen beteiligten Zeilen). Dies würde dazu führen, dass ein Datenbank-Dump und eine Datenbank-Wiederherstellung fehlschlagen. Die Wiederherstellung könnte selbst dann fehlschlagen, wenn der vollständige Datenbankstatus mit der Einschränkung übereinstimmt, weil die Zeilen nicht in einer Reihenfolge geladen werden, die die Einschränkung erfüllt. Wenn möglich, verwenden SieEINZIGARTIG,AUSSCHLIESSEN, oderUNBEKANNTER SCHLÜSSELEinschränkungen, um zeilen- und tabellenübergreifende Einschränkungen auszudrücken.

Wenn Sie eine einmalige Prüfung mit anderen Zeilen beim Zeileneinfügen wünschen und nicht eine kontinuierlich aufrechterhaltene Konsistenzgarantie, dann eine benutzerdefinierteauslösenkann verwendet werden, um das umzusetzen. (Dieser Ansatz vermeidet das Dump/Restore-Problem, weilpg_dumpinstalliert Trigger erst nach der Wiederherstellung der Daten neu, sodass die Prüfung während eines Dumps/Wiederherstellungsvorgangs nicht erzwungen wird.)

Notiz

PostgreSQLgeht davon ausÜBERPRÜFENDie Bedingungen von Einschränkungen sind unveränderlich, das heißt, sie liefern immer das gleiche Ergebnis für dieselbe Eingabezeile. Diese Annahme rechtfertigt eine UntersuchungÜBERPRÜFENEinschränkungen gelten nur beim Einfügen oder Aktualisieren von Zeilen und nicht zu anderen Zeiten. (Die obige Warnung, nicht auf andere Tabellendaten zu verweisen, ist eigentlich ein Sonderfall dieser Einschränkung.)

Ein Beispiel für eine gängige Möglichkeit, diese Annahme zu durchbrechen, besteht darin, auf eine benutzerdefinierte Funktion in a zu verweisenÜBERPRÜFENAusdruck und ändern Sie dann das Verhalten dieser Funktion.PostgreSQLverbietet dies nicht, bemerkt aber nicht, ob es Zeilen in der Tabelle gibt, die jetzt gegen die Regeln verstoßenÜBERPRÜFENZwang. Dies würde dazu führen, dass ein nachfolgender Datenbank-Dump und eine Wiederherstellung fehlschlagen. Der empfohlene Weg, mit einer solchen Änderung umzugehen, besteht darin, die Einschränkung aufzuheben (mitTABELLE ÄNDERN), passen Sie die Funktionsdefinition an und fügen Sie die Einschränkung erneut hinzu, wodurch sie erneut mit allen Tabellenzeilen verglichen wird.

5.4.2.Nicht-Null-Einschränkungen

Eine Nicht-Null-Einschränkung gibt lediglich an, dass eine Spalte nicht den Nullwert annehmen darf. Ein Syntaxbeispiel:

CREATE TABLE Produkte (product_no integerNICHT NULL, NamenstextNICHT NULL, Preis numerisch);

Eine Nicht-Null-Einschränkung wird immer als Spalteneinschränkung geschrieben. Eine Nicht-Null-Einschränkung entspricht funktional der Erstellung einer PrüfeinschränkungÜBERPRÜFEN (SpaltennameIST NICHT NULL), aber inPostgreSQLDas Erstellen einer expliziten Nicht-Null-Einschränkung ist effizienter. Der Nachteil besteht darin, dass Sie den auf diese Weise erstellten Nicht-Null-Einschränkungen keine expliziten Namen geben können.

Natürlich kann eine Spalte mehr als eine Einschränkung haben. Schreiben Sie einfach die Einschränkungen nacheinander auf:

CREATE TABLE products (product_no integer NOT NULL, name text NOT NULL, price numeric NOT NULL CHECK (price > 0));

Die Reihenfolge spielt keine Rolle. Es bestimmt nicht unbedingt, in welcher Reihenfolge die Einschränkungen überprüft werden.

DerNICHT NULLDie Einschränkung hat eine Umkehrung: dieNULLZwang. Dies bedeutet nicht, dass die Spalte null sein muss, was sicherlich nutzlos wäre. Stattdessen wird einfach das Standardverhalten ausgewählt, bei dem die Spalte möglicherweise null ist. DerNULLDie Einschränkung ist im SQL-Standard nicht vorhanden und sollte nicht in portablen Anwendungen verwendet werden. (Es wurde nur hinzugefügtPostgreSQL(um mit einigen anderen Datenbanksystemen kompatibel zu sein.) Einige Benutzer mögen es jedoch, weil es das Umschalten der Einschränkung in einer Skriptdatei erleichtert. Sie könnten zum Beispiel beginnen mit:

CREATE TABLE Produkte (Produktnummer Ganzzahl NULL, Namenstext NULL, Preis numerisch NULL);

und dann einfügenNICHTSchlüsselwort, wo gewünscht.

Tipp

In den meisten Datenbankdesigns sollten die meisten Spalten nicht als Null markiert sein.

5.4.3.Eindeutige Einschränkungen

(Video) Perner/Spitzer/Kodek - Abschnitt 5.4 - Produkthaftung

Eindeutige Einschränkungen stellen sicher, dass die in einer Spalte oder einer Spaltengruppe enthaltenen Daten in allen Zeilen der Tabelle eindeutig sind. Die Syntax lautet:

CREATE TABLE Produkte (product_no integerEINZIGARTIG, Namenstext, Preis numerisch);

wenn als Spaltenbeschränkung geschrieben, und:

TABELLE ERSTELLEN Produkte (Produktnummer Ganzzahl, Namenstext, Preis numerisch,EINZIGARTIG (Produktnummer));

wenn es als Tabelleneinschränkung geschrieben wird.

Um eine eindeutige Einschränkung für eine Gruppe von Spalten zu definieren, schreiben Sie sie als Tabelleneinschränkung, wobei die Spaltennamen durch Kommas getrennt sind:

CREATE TABLE-Beispiel (a-Ganzzahl, b-Ganzzahl, c-Ganzzahl,EINZIGARTIG (a, c));

Dies gibt an, dass die Kombination von Werten in den angegebenen Spalten in der gesamten Tabelle eindeutig ist, obwohl keine der Spalten eindeutig sein muss (und normalerweise auch nicht ist).

Sie können einer Eindeutigkeitsbeschränkung wie gewohnt einen eigenen Namen zuweisen:

CREATE TABLE Produkte (product_no integerCONSTRAINT muss_anders seinEINZIGARTIG, Namenstext, Preis numerisch);

Durch das Hinzufügen einer eindeutigen Einschränkung wird automatisch ein eindeutiger B-Tree-Index für die in der Einschränkung aufgeführte Spalte oder Spaltengruppe erstellt. Eine Eindeutigkeitsbeschränkung, die nur einige Zeilen abdeckt, kann nicht als eindeutige Einschränkung geschrieben werden, aber es ist möglich, eine solche Einschränkung durch die Erstellung einer eindeutigen Einschränkung durchzusetzenTeilindex.

Im Allgemeinen wird eine Eindeutigkeitsbeschränkung verletzt, wenn die Tabelle mehr als eine Zeile enthält, in der die Werte aller in der Beschränkung enthaltenen Spalten gleich sind. Standardmäßig werden zwei Nullwerte in diesem Vergleich nicht als gleich betrachtet. Das bedeutet, dass es auch bei Vorhandensein einer eindeutigen Einschränkung möglich ist, doppelte Zeilen zu speichern, die in mindestens einer der eingeschränkten Spalten einen Nullwert enthalten. Dieses Verhalten kann durch Hinzufügen der Klausel geändert werdenNULLEN NICHT UNTERSCHEIDBAR, wie

CREATE TABLE Produkte ( Produktnummer Ganzzahl UNIQUENULLEN NICHT UNTERSCHEIDBAR, Namenstext, Preis numerisch);

oder

CREATE TABLE Produkte (Produktnummer Ganzzahl, Namenstext, Preis numerisch, EINZIGARTIGNULLEN NICHT UNTERSCHEIDBAR(product_no));

Das Standardverhalten kann explizit mit angegeben werdenNULLEN UNTERSCHIEDLICH. Die standardmäßige Nullbehandlung in eindeutigen Einschränkungen wird gemäß dem SQL-Standard durch die Implementierung definiert, und andere Implementierungen weisen ein anderes Verhalten auf. Seien Sie also vorsichtig, wenn Sie Anwendungen entwickeln, die portabel sein sollen.

5.4.4.Primärschlüssel

Eine Primärschlüsseleinschränkung gibt an, dass eine Spalte oder eine Gruppe von Spalten als eindeutiger Bezeichner für Zeilen in der Tabelle verwendet werden kann. Dies erfordert, dass die Werte sowohl eindeutig als auch nicht null sind. Die folgenden beiden Tabellendefinitionen akzeptieren also dieselben Daten:

CREATE TABLE products (product_no integer UNIQUE NOT NULL, name text, price numeric);
CREATE TABLE Produkte (product_no integerPRIMÄRSCHLÜSSEL, Namenstext, Preis numerisch);

Primärschlüssel können sich über mehr als eine Spalte erstrecken; Die Syntax ähnelt eindeutigen Einschränkungen:

CREATE TABLE-Beispiel (a-Ganzzahl, b-Ganzzahl, c-Ganzzahl,PRIMÄRSCHLÜSSEL (a, c));

Durch das Hinzufügen eines Primärschlüssels wird automatisch ein eindeutiger B-Tree-Index für die im Primärschlüssel aufgeführte Spalte oder Spaltengruppe erstellt und die Markierung der Spalte(n) erzwungenNICHT NULL.

Eine Tabelle kann höchstens einen Primärschlüssel haben. (Es kann eine beliebige Anzahl eindeutiger und Nicht-Null-Einschränkungen geben, die funktional fast dasselbe sind, aber nur eine kann als Primärschlüssel identifiziert werden.) Die relationale Datenbanktheorie schreibt vor, dass jede Tabelle einen Primärschlüssel haben muss. Diese Regel wird nicht durchgesetztPostgreSQL, aber normalerweise ist es am besten, sich daran zu halten.

(Video) Was ist Pressefreiheit? | einfach erklärt | So geht MEDIEN | alpha Lernen

Primärschlüssel sind sowohl für Dokumentationszwecke als auch für Clientanwendungen nützlich. Beispielsweise muss eine GUI-Anwendung, die das Ändern von Zeilenwerten ermöglicht, wahrscheinlich den Primärschlüssel einer Tabelle kennen, um Zeilen eindeutig identifizieren zu können. Es gibt auch verschiedene Möglichkeiten, wie das Datenbanksystem einen Primärschlüssel nutzt, sofern einer deklariert wurde; Beispielsweise definiert der Primärschlüssel die Standardzielspalte(n) für Fremdschlüssel, die auf seine Tabelle verweisen.

5.4.5.Fremdschlüssel

Eine Fremdschlüsseleinschränkung gibt an, dass die Werte in einer Spalte (oder einer Gruppe von Spalten) mit den Werten übereinstimmen müssen, die in einer Zeile einer anderen Tabelle erscheinen. Wir sagen, das hält diereferenzielle Integritätzwischen zwei verwandten Tabellen.

Angenommen, Sie haben die Produkttabelle, die wir bereits mehrmals verwendet haben:

CREATE TABLE products (product_no integer PRIMARY KEY, name text, price numeric);

Nehmen wir außerdem an, Sie haben eine Tabelle, in der Bestellungen dieser Produkte gespeichert sind. Wir möchten sicherstellen, dass die Bestelltabelle nur Bestellungen von Produkten enthält, die tatsächlich vorhanden sind. Daher definieren wir eine Fremdschlüsseleinschränkung in der Auftragstabelle, die auf die Produkttabelle verweist:

CREATE TABLE-Bestellungen ( order_id integer PRIMARY KEY, product_no integerREFERENZEN Produkte (Produktnummer), Menge ganzzahlig);

Jetzt ist es unmöglich, Aufträge mit einem Wert ungleich NULL zu erstellenProdukt_NrEinträge, die nicht in der Produkttabelle erscheinen.

Wir sagen, dass in dieser Situation die Auftragstabelle die istReferenzierungTabelle und die Produkttabelle ist dieverwiesenTisch. Ebenso gibt es referenzierende und referenzierte Spalten.

Sie können den obigen Befehl auch wie folgt kürzen:

CREATE TABLE-Bestellungen ( order_id integer PRIMARY KEY, product_no integerREFERENZEN Produkte, Menge ganzzahlig);

denn wenn keine Spaltenliste vorhanden ist, wird der Primärschlüssel der referenzierten Tabelle als referenzierte Spalte(n) verwendet.

Sie können einer Fremdschlüsseleinschränkung wie gewohnt einen eigenen Namen zuweisen.

Ein Fremdschlüssel kann auch eine Gruppe von Spalten einschränken und darauf verweisen. Wie üblich muss es dann in Tabellenform geschrieben werden. Hier ist ein erfundenes Syntaxbeispiel:

CREATE TABLE t1 (a Integer PRIMARY KEY, b Integer, c Integer,AUSLÄNDISCHER SCHLÜSSEL (b, c) REFERENZEN other_table (c1, c2));

Natürlich müssen Anzahl und Typ der eingeschränkten Spalten mit der Anzahl und dem Typ der referenzierten Spalten übereinstimmen.

Manchmal ist es nützlich für dieanderer Tischeiner Fremdschlüsseleinschränkung, um dieselbe Tabelle zu sein; das nennt man aselbstreferenziellUnbekannter Schlüssel. Wenn Sie beispielsweise möchten, dass Zeilen einer Tabelle Knoten einer Baumstruktur darstellen, können Sie schreiben

CREATE TABLE-Baum (node_id integer PRIMARY KEY, parent_id integer REFERENCES tree, name text, ...);

Ein Knoten der obersten Ebene hätte NULLEltern ID, während nicht NULLEltern IDEinträge wären darauf beschränkt, auf gültige Zeilen der Tabelle zu verweisen.

Eine Tabelle kann mehr als eine Fremdschlüsseleinschränkung haben. Dies wird verwendet, um Viele-zu-Viele-Beziehungen zwischen Tabellen zu implementieren. Angenommen, Sie haben Tabellen zu Produkten und Bestellungen, möchten aber nun zulassen, dass eine Bestellung möglicherweise viele Produkte enthält (was die obige Struktur nicht zuließ). Sie könnten diese Tabellenstruktur verwenden:

TABELLE ERSTELLEN Produkte (Produktnr. Ganzzahl PRIMÄRSCHLÜSSEL, Namenstext, Preis numerisch); TABELLE BESTELLUNGEN ERSTELLEN (Bestellnummer Ganzzahl PRIMÄRSCHLÜSSEL, Versandadressentext, ...); TABELLE BESTELLUNGEN ERSTELLEN (Produktnr. Ganzzahl REFERENZEN Produkte, Bestellnummer Ganzzahl REFERENZEN Bestellungen, Menge Ganzzahl, PRIMÄRSCHLÜSSEL (product_no, order_id));

Beachten Sie, dass sich der Primärschlüssel mit den Fremdschlüsseln in der letzten Tabelle überschneidet.

Wir wissen, dass die Fremdschlüssel die Erstellung von Bestellungen, die sich nicht auf Produkte beziehen, nicht zulassen. Was aber, wenn ein Produkt entfernt wird, nachdem eine Bestellung erstellt wurde, die darauf verweist? Mit SQL können Sie auch damit umgehen. Intuitiv haben wir einige Möglichkeiten:

(Video) 5.4 Wie konnte ein Kunstprojekt einen politischen Dialog und Partizipation anstoßen?

  • Das Löschen eines referenzierten Produkts ist nicht zulässig

  • Löschen Sie auch die Bestellungen

  • Etwas anderes?

Um dies zu veranschaulichen, implementieren wir die folgende Richtlinie im obigen Beispiel einer Viele-zu-Viele-Beziehung: Wenn jemand ein Produkt entfernen möchte, auf das noch in einer Bestellung verwiesen wird (viaAuftragspositionen), wir verbieten es. Wenn jemand eine Bestellung entfernt, werden auch die Bestellpositionen entfernt:

CREATE TABLE-Produkte (Produktnr. Ganzzahl PRIMÄRSCHLÜSSEL, Namenstext, Preis numerisch); TABLE-Bestellungen erstellen (Bestell-ID-Ganzzahl PRIMÄRSCHLÜSSEL, Versandadressentext, ...); TABLE-Bestellartikel erstellen (Produktnr. Ganzzahl REFERENZEN ProdukteEIN LÖSCHEN EINSCHRÄNKEN, order_id integer REFERENZEN BestellungenON CASCADE LÖSCHEN, Menge Ganzzahl, PRIMARY KEY (product_no, order_id));

Einschränkende und kaskadierende Löschvorgänge sind die beiden häufigsten Optionen.BESCHRÄNKENverhindert das Löschen einer referenzierten Zeile.KEINE AKTIONbedeutet, dass ein Fehler ausgelöst wird, wenn bei der Überprüfung der Einschränkung noch referenzierende Zeilen vorhanden sind; Dies ist das Standardverhalten, wenn Sie nichts angeben. (Der wesentliche Unterschied zwischen diesen beiden Optionen besteht darinKEINE AKTIONermöglicht es, den Scheck auf einen späteren Zeitpunkt der Transaktion zu verschiebenBESCHRÄNKENnicht.)KASKADEGibt an, dass beim Löschen einer referenzierten Zeile automatisch auch die darauf verweisenden Zeilen gelöscht werden sollen. Es gibt zwei weitere Möglichkeiten:NULL SETZENUndSTANDARD EINSTELLEN. Dies führt dazu, dass die referenzierende(n) Spalte(n) in der/den referenzierenden Zeile(n) auf Nullen bzw. ihre Standardwerte gesetzt werden, wenn die referenzierte Zeile gelöscht wird. Beachten Sie, dass diese Sie nicht von der Einhaltung etwaiger Einschränkungen entbinden. Zum Beispiel, wenn eine Aktion angibtSTANDARD EINSTELLENder Standardwert jedoch die Fremdschlüsseleinschränkung nicht erfüllen würde, schlägt der Vorgang fehl.

Die passende Wahl vonAUF LÖSCHENDie Aktion hängt davon ab, welche Arten von Objekten die zugehörigen Tabellen darstellen. Wenn die referenzierende Tabelle etwas darstellt, das eine Komponente dessen ist, was durch die referenzierte Tabelle dargestellt wird, und nicht unabhängig existieren kann, dannKASKADEkönnte angebracht sein. Wenn die beiden Tabellen unabhängige Objekte darstellen, dannBESCHRÄNKENoderKEINE AKTIONist angemessener; Eine Anwendung, die tatsächlich beide Objekte löschen möchte, müsste dies dann explizit angeben und zwei Löschbefehle ausführen. Im obigen Beispiel sind Bestellpositionen Teil einer Bestellung, und es ist praktisch, wenn sie automatisch gelöscht werden, wenn eine Bestellung gelöscht wird. Da Produkte und Bestellungen jedoch unterschiedliche Dinge sind, kann es als problematisch angesehen werden, wenn das Löschen eines Produkts automatisch dazu führt, dass auch einige Bestellpositionen gelöscht werden. Die TatenNULL SETZENoderSTANDARD EINSTELLENkann geeignet sein, wenn eine Fremdschlüsselbeziehung optionale Informationen darstellt. Wenn die Produkttabelle beispielsweise einen Verweis auf einen Produktmanager enthielt und der Produktmanagereintrag gelöscht wird, kann es hilfreich sein, den Produktmanager des Produkts auf Null oder einen Standardwert zu setzen.

Die TatenNULL SETZENUndSTANDARD EINSTELLENkann eine Spaltenliste verwenden, um anzugeben, welche Spalten festgelegt werden sollen. Normalerweise werden alle Spalten der Fremdschlüsseleinschränkung festgelegt; In einigen Sonderfällen ist es sinnvoll, nur eine Teilmenge festzulegen. Betrachten Sie das folgende Beispiel:

CREATE TABLE-Mandanten (mieter_id-Ganzzahl PRIMARY KEY);CREATE TABLE-Benutzer (mieter_id-Ganzzahl REFERENZEN Mieter ON DELETE CASCADE, user_id-Ganzzahl NICHT NULL, PRIMARY KEY (mieter_id, user_id));CREATE TABLE-Beiträge (mieter_id-Ganzzahl REFERENZEN Mieter ON DELETE CASCADE, post_id-Ganzzahl NICHT NULL, Autoren-ID-Ganzzahl, PRIMÄRSCHLÜSSEL (Mandanten-ID, Post-ID), AUSLÄNDISCHER SCHLÜSSEL (Mandanten-ID, Autoren-ID) REFERENZIERT Benutzer AUF DELETE SET NULL(author_id));

Ohne die Angabe der Spalte würde der Fremdschlüssel auch die Spalte festlegenMieter_IDauf null gesetzt, aber diese Spalte ist weiterhin als Teil des Primärschlüssels erforderlich.

Analog zuAUF LÖSCHENEs gibt auchAUF UPDATEDies wird aufgerufen, wenn eine referenzierte Spalte geändert (aktualisiert) wird. Die möglichen Aktionen sind dieselben, mit der Ausnahme, dass keine Spaltenlisten angegeben werden könnenNULL SETZENUndSTANDARD EINSTELLEN. In diesem Fall,KASKADEbedeutet, dass die aktualisierten Werte der referenzierten Spalte(n) in die referenzierende(n) Zeile(n) kopiert werden sollen.

Normalerweise muss eine referenzierende Zeile die Fremdschlüsseleinschränkung nicht erfüllen, wenn eine ihrer referenzierenden Spalten null ist. WennSPIEL VOLLzur Fremdschlüsseldeklaration hinzugefügt wird, entkommt eine referenzierende Zeile der Einschränkung nur dann, wenn alle ihre referenzierenden Spalten null sind (so dass eine Mischung aus Null- und Nicht-Null-Werten garantiert fehlschlägt).SPIEL VOLLZwang). Wenn Sie nicht möchten, dass referenzierende Zeilen die Fremdschlüsseleinschränkung nicht erfüllen müssen, deklarieren Sie die referenzierenden Spalten alsNICHT NULL.

Ein Fremdschlüssel muss auf Spalten verweisen, die entweder ein Primärschlüssel sind oder eine eindeutige Einschränkung bilden. Dies bedeutet, dass die referenzierten Spalten immer einen Index haben (denjenigen, der dem Primärschlüssel oder der eindeutigen Einschränkung zugrunde liegt); Daher ist es effizient, zu prüfen, ob eine Referenzzeile übereinstimmt. Seit einemLÖSCHENeiner Zeile aus der referenzierten Tabelle oder einerAKTUALISIERENWenn eine referenzierte Spalte einen Scan der referenzierenden Tabelle nach Zeilen erfordert, die mit dem alten Wert übereinstimmen, empfiehlt es sich oft, auch die referenzierenden Spalten zu indizieren. Da dies nicht immer erforderlich ist und viele Optionen für die Indizierung zur Verfügung stehen, wird durch die Deklaration einer Fremdschlüsseleinschränkung nicht automatisch ein Index für die referenzierenden Spalten erstellt.

Weitere Informationen zum Aktualisieren und Löschen von Daten finden Sie inKapitel 6. Sehen Sie sich auch die Beschreibung der Fremdschlüsseleinschränkungssyntax in der Referenzdokumentation für anTABELLE ERSTELLEN.

5.4.6.Ausschlussbeschränkungen

Ausschlusseinschränkungen stellen sicher, dass, wenn zwei beliebige Zeilen in den angegebenen Spalten oder Ausdrücken mit den angegebenen Operatoren verglichen werden, mindestens einer dieser Operatorvergleiche „Falsch“ oder „Null“ zurückgibt. Die Syntax lautet:

CREATE TABLE-Kreise (c-Kreis, AUSSCHLIEßEN MIT Gist (c MIT &&));

Siehe auchTABELLE ERSTELLEN ... EINSCHRÄNKEN ... AUSSCHLIEßENfür Details.

Durch das Hinzufügen einer Ausschlusseinschränkung wird automatisch ein Index des Typs erstellt, der in der Einschränkungsdeklaration angegeben ist.

(Video) KLEINSTES E-BIKE DER WELT! La Pierre Overvolt HT 5.4 Mix 2023 SO BILLIG!

Videos

1. "Hygienedemos": Heißes Pflaster für Journalisten | ZAPP | NDR
(ZAPP - Das Medienmagazin)
2. Sonova - Für ein Leben ohne Einschränkungen
(Sonova)
3. Kapitel 5.4 - Hypochondrie, die Angst vor Krankheiten: Wie Sie die Krankheitsangst endlich...
(Maike Ahlers - Topic)
4. Pakte OHNE Einschränkungen wechseln & Ruhmstufen SCHNELL aufholen erklärt | WoW 9.1.5 PTR
(Spielbursche)
5. Mathe 9 / Video 5.4: Berechnung von Logarithmen (Trick)
(Der Matheflüsterer)
6. Aufzeichnung vom 5.4.20 Mit Yoga in den Tag
(Tanja Martens)

References

Top Articles
Latest Posts
Article information

Author: Melvina Ondricka

Last Updated: 09/10/2023

Views: 6215

Rating: 4.8 / 5 (48 voted)

Reviews: 95% of readers found this page helpful

Author information

Name: Melvina Ondricka

Birthday: 2000-12-23

Address: Suite 382 139 Shaniqua Locks, Paulaborough, UT 90498

Phone: +636383657021

Job: Dynamic Government Specialist

Hobby: Kite flying, Watching movies, Knitting, Model building, Reading, Wood carving, Paintball

Introduction: My name is Melvina Ondricka, I am a helpful, fancy, friendly, innocent, outstanding, courageous, thoughtful person who loves writing and wants to share my knowledge and understanding with you.