it-swarm.com.de

Unterschiede zwischen MATCH FULL, MATCH SIMPLE und MATCH PARTIAL?

Ich habe einen MATCH SIMPLE Und einen MATCH FULL Bemerkt, aber ich verstehe nicht, was sie tun. Ich sehe Standard ist MATCH SIMPLE; Aber wie verhalten sich die anderen MATCH -Klauseln zur FOREIGN KEY - Einschränkungsfunktion?

32
user32234

Überprüf den CREATE TABLE Seite des Handbuchs :

Es gibt drei Übereinstimmungstypen: MATCH FULL, MATCH PARTIAL, und MATCH SIMPLE (dies ist die Standardeinstellung). MATCH FULL lässt nicht zu, dass eine Spalte eines mehrspaltigen Fremdschlüssels null ist, es sei denn, alle Fremdschlüsselspalten sind null. Wenn sie alle null sind, muss die Zeile keine Übereinstimmung in der referenzierten Tabelle haben. MATCH SIMPLE erlaubt, dass eine der Fremdschlüsselspalten null ist; Wenn einer von ihnen null ist, muss die Zeile keine Übereinstimmung in der referenzierten Tabelle haben. MATCH PARTIAL ist noch nicht implementiert. (Natürlich, NOT NULL Einschränkungen können auf die Referenzierungsspalte (n) angewendet werden, um zu verhindern, dass diese Fälle auftreten.)

Auch im Kapitel über Fremdschlüssel :

Normalerweise muss eine referenzierende Zeile die Fremdschlüsseleinschränkung nicht erfüllen, wenn eine ihrer referenzierenden Spalten null ist. Wenn MATCH FULL wird der Fremdschlüsseldeklaration hinzugefügt. Eine referenzierende Zeile wird nur dann ausgeblendet, wenn alle referenzierenden Spalten null sind (eine Mischung aus Null- und Nicht-Null-Werten schlägt also garantiert fehl, wenn ein MATCH FULL Einschränkung). Wenn Sie nicht möchten, dass referenzierende Zeilen die Erfüllung der Fremdschlüsseleinschränkung vermeiden können, deklarieren Sie die referenzierenden Spalten als NOT NULL.

Lesen Sie auch das aktuelle Handbuch oder die Version, die Ihrer Installation entspricht. Verlieben Sie sich nicht in veraltete Google-Links zu veralteten Versionen.

43

FULL vs SIMPLE vs PARTIAL

Die gewählte Antwort ist zwar korrekt, aber wenn dies für Sie neu ist, möchten Sie sie möglicherweise mit Code sehen - ich denke, es ist einfacher, auf diese Weise zu groken.

-- one row with (1,1)
CREATE TABLE foo ( a int, b int,
  PRIMARY KEY (a,b)
);
INSERT INTO foo (a,b) VALUES (1,1);

--
-- two child tables to reference it
-- 
CREATE TABLE t_full ( a int, b int,
  FOREIGN KEY (a,b) REFERENCES foo MATCH FULL
);
CREATE TABLE t_simple ( a int, b int,
  FOREIGN KEY (a,b) REFERENCES foo MATCH SIMPLE
);

Logischerweise können wir mit FULL und SIMPLE eine vollständige Übereinstimmung einfügen.

-- works
INSERT INTO t_full (a,b) VALUES (1,1);
INSERT INTO t_simple (a,b) VALUES (1,1);

Das Problem tritt auf, wenn eine der Spalten NULL ist.

-- works
INSERT INTO t_simple (a,b) VALUES (1,NULL);

-- fails
INSERT INTO t_full (a,b) VALUES (1,NULL);

Das Einfügen in t_full Erzeugt den folgenden Fehler:

ERROR:  insert or update on table "t_full" violates foreign key constraint "t_full_a_fkey"
DETAIL:  MATCH FULL does not allow mixing of null and nonnull key values.
INSERT 0 1

Ok, was ist mit (42,NULL) - das ist der Teil, den ich bei MATCH SIMPLE Immer verwirrend fand.

-- works
INSERT INTO t_simple (a,b) VALUES (42,NULL);

Das obige Verhalten würde NICHT mit dem nicht implementierten MATCH PARTIAL Funktionieren, der wahrscheinlich das tut, was Sie für einen zusammengesetzten Index wollen, bei dem sich die Spalte ganz rechts befindet NULLed out. Einige Leute sehen dies jedoch als eine Methode an, die Büchse einer Pandora für schlechtes Design zu öffnen.

Einfache Definitionen & Mnemonik

  • MATCH FULL Alles muss vollständig übereinstimmen, oder alle Spalten müssen NULL sein
  • MATCH SIMPLE Wenn eine Sache NULL ist, wird die Einschränkung einfach ignoriert.
  • MATCH PARTIAL Wenn eine Sache NULL ist, wird die Tatsache, dass nicht alles NULL ist, teilweise gerettet von etwas Vernünftiges für den Zweck der Einschränkung tun.

SQL Spec Notes

Für die Nachwelt sind hier die Definitionen aus der SQL-Spezifikation auf dem <match type>

  • MATCH SIMPLE Wenn mindestens eine Referenzierungsspalte null ist, besteht die Zeile der Referenzierungstabelle die Einschränkungsprüfung. Wenn alle referenzierenden Spalten nicht null sind, besteht die Zeile genau dann die Einschränkungsprüfung, wenn eine Zeile der referenzierten Tabelle vorhanden ist, die allen referenzierenden Spalten entspricht.
  • MATCH PARTIAL: Wenn alle referenzierenden Spalten null sind, besteht die Zeile der referenzierenden Tabelle die Einschränkungsprüfung. Wenn mindestens eine referenzierende Spalte nicht null ist, besteht die Zeile genau dann die Einschränkungsprüfung, wenn eine Zeile der referenzierten Tabelle vorhanden ist, die mit allen nicht null referenzierenden Spalten übereinstimmt.
  • MATCH FULL: Wenn alle referenzierenden Spalten null sind, besteht die Zeile der referenzierenden Tabelle die Einschränkungsprüfung. Wenn alle referenzierenden Spalten nicht null sind, besteht die Zeile genau dann die Einschränkungsprüfung, wenn eine Zeile der referenzierten Tabelle vorhanden ist, die allen referenzierenden Spalten entspricht. Wenn eine Referenzierungsspalte null und eine andere Referenzierungsspalte nicht null ist, verletzt die Zeile der Referenzierungstabelle die Einschränkungsprüfung.

Obwohl dies nicht PostgreSQL-spezifisch ist, werden diese Beispiele mit PostgreSQL demonstriert

11
Evan Carroll