NULL
in Unique Keys
Die SQL-99-kompatiblen Regeln von Firebird für UNIQUE
-Beschränkungen erlauben eine oder mehrere NULL
s in einer Spalte mit einer UNIQUE
-Beschränkung.Dadurch ist es möglich, eine UNIQUE
-Beschränkung für eine Spalte zu definieren, die nicht die NOT NULL
-Beschränkung hat.
Bei UNIQUE
-Schlüsseln, die sich über mehrere Spalten erstrecken, ist die Logik etwas kompliziert:
-
Mehrere Zeilen mit Null in allen Spalten des Schlüssels sind zulässig
-
Mehrere Zeilen mit Schlüsseln mit unterschiedlichen Kombinationen von Nullen und Nicht-Null-Werten sind zulässig
-
Mehrere Zeilen mit den gleichen Schlüsselspalten null und der Rest mit Werten ungleich null sind erlaubt, sofern sich die Werte in mindestens einer Spalte unterscheiden
-
Mehrere Zeilen mit den gleichen Schlüsselspalten null und der Rest mit Werten ungleich null gefüllt, die in jeder Spalte gleich sind, verletzen die Einschränkung
Die Regeln für die Eindeutigkeit lassen sich wie folgt zusammenfassen:
Im Prinzip werden alle Nullen als verschieden betrachtet. Wenn jedoch zwei Zeilen genau die gleichen Schlüsselspalten haben, die mit Nicht-Null-Werten gefüllt sind, werden die 'NULL'-Spalten ignoriert und die Eindeutigkeit der Nicht-Null-Spalten wird so bestimmt, als ob sie den gesamten Schlüssel bilden würden.
RECREATE TABLE t( x int, y int, z int, unique(x,y,z));
INSERT INTO t values( NULL, 1, 1 );
INSERT INTO t values( NULL, NULL, 1 );
INSERT INTO t values( NULL, NULL, NULL );
INSERT INTO t values( NULL, NULL, NULL ); -- Permitted
INSERT INTO t values( NULL, NULL, 1 ); -- Not permitted