Heim >Datenbank >MySQL-Tutorial >Wie erzwinge ich eindeutige Einschränkungen für Nullable-Spalten in SQL Server?

Wie erzwinge ich eindeutige Einschränkungen für Nullable-Spalten in SQL Server?

Linda Hamilton
Linda HamiltonOriginal
2025-01-04 00:05:39953Durchsuche

How to Enforce Unique Constraints on Nullable Columns in SQL Server?

Eindeutige Nicht-NULL-Einschränkungen für NULL-fähige Spalten

Oft ist es wünschenswert, die Eindeutigkeit einer Spalte zu erzwingen und gleichzeitig Nullwerte zuzulassen. Das Erstellen eines eindeutigen Index für eine NULLable-Spalte in SQL Server 2005 kann jedoch eine Herausforderung sein.

Aktuelle Lösungen

Eine häufige Problemumgehung besteht darin, einen eindeutigen Index für eine materialisierte Spalte zu erstellen Ansicht, die Nullwerte ausschließt:

CREATE VIEW vw_unq WITH SCHEMABINDING AS
    SELECT Column1
      FROM MyTable
     WHERE Column1 IS NOT NULL

CREATE UNIQUE CLUSTERED INDEX unq_idx ON vw_unq (Column1)

Besser Alternativen

SQL Server 2008 hat gefilterte Indizes eingeführt, die eine bessere Lösung bieten:

CREATE UNIQUE INDEX AK_MyTable_Column1 ON MyTable (Column1) WHERE Column1 IS NOT NULL

Dieser Index lässt Nullwerte zu und erzwingt gleichzeitig die Eindeutigkeit bei Nicht-Null-Werten.

Zusätzliche Option: Trigger

Eine weitere Alternative besteht darin, einen Trigger zu erstellen um bei Einfüge- und Aktualisierungsvorgängen auf Eindeutigkeit zu prüfen:

CREATE TRIGGER trg_MyTable_CheckUnique ON MyTable AFTER INSERT, UPDATE
AS
BEGIN
    IF EXISTS(SELECT * FROM MyTable WHERE Column1 = NEW.Column1 AND Column1 IS NOT NULL)
    BEGIN
        RAISERROR('Duplicate value for Column1.', 16, 1)
    END
END

Trigger können sich jedoch auf die Leistung auswirken, insbesondere auf Systemen mit hoher Parallelität.

Das obige ist der detaillierte Inhalt vonWie erzwinge ich eindeutige Einschränkungen für Nullable-Spalten in SQL Server?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn