Eindeutigkeit über mehrere SQL Server-Spalten hinweg erzwingen
Häufig erfordert die Datenbankintegrität das Verhindern doppelter Zeilen basierend auf mehreren Spaltenwerten. In diesem Artikel wird gezeigt, wie Sie eine eindeutige Einschränkung für die Spalten PersonNumber
und Active
in einer Tabelle Person
erzwingen.
Implementierung der Unique-Beschränkung
Nachdem Sie alle bereits vorhandenen doppelten Einträge entfernt haben, wenden Sie die Einschränkung mit einer dieser Methoden an:
ALTER TABLE
Anweisung: Dadurch wird die Einschränkung direkt zur vorhandenen Tabelle hinzugefügt.
<code class="language-sql">ALTER TABLE dbo.Person ADD CONSTRAINT uq_Person_NumberActive UNIQUE (PersonNumber, Active);</code>
CREATE UNIQUE INDEX
Anweisung: Dadurch wird ein eindeutiger Index erstellt, der implizit die Eindeutigkeitsbeschränkung erzwingt.
<code class="language-sql">CREATE UNIQUE INDEX uq_Person_NumberActive ON dbo.Person (PersonNumber, Active);</code>
Alternative Ansätze & Optimierung
Während die oben genannten Methoden effektiv sind, sollten Sie die folgenden Verbesserungen in Betracht ziehen:
TRY...CATCH
Blöcken vermieden werden.INSTEAD OF
Trigger: Ein INSTEAD OF
-Trigger ermöglicht eine bedingte Einfügelogik und verhindert, dass sich Ausnahmen auf die Anwendungsebene ausbreiten. Dies bietet einen robusteren Fehlerbehandlungsmechanismus.Anschauliches Beispiel
Dieses Beispiel zeigt die einzigartige Einschränkung in Aktion:
<code class="language-sql">-- Create the Person table CREATE TABLE dbo.Person ( ID INT IDENTITY(1, 1) PRIMARY KEY, Name NVARCHAR(32) NOT NULL, Active BIT NOT NULL DEFAULT 0, PersonNumber INT NOT NULL ); -- Add the unique constraint ALTER TABLE dbo.Person ADD CONSTRAINT uq_Person_NumberActive UNIQUE (PersonNumber, Active); -- Insert data INSERT INTO dbo.Person (Name, Active, PersonNumber) VALUES ('John Doe', 1, 1234); INSERT INTO dbo.Person (Name, Active, PersonNumber) VALUES ('Jane Doe', 0, 5678); -- Attempt to insert a duplicate (this will fail) INSERT INTO dbo.Person (Name, Active, PersonNumber) VALUES ('John Doe', 1, 1234);</code>
Dadurch wird sichergestellt, dass für jede eindeutige Kombination aus PersonNumber
und Active
-Status nur ein Datensatz vorhanden ist. Jeder Versuch, ein Duplikat einzufügen, führt zu einem Fehler. Denken Sie daran, dbo.Person
durch Ihr tatsächliches Schema und Ihren Tabellennamen zu ersetzen.
Das obige ist der detaillierte Inhalt vonWie kann ich eine eindeutige Einschränkung über mehrere Spalten im SQL -Server durchsetzen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!