Implementierung mehrspaltiger eindeutiger Einschränkungen in SQL Server
Die Sicherstellung eindeutiger Wertekombinationen über mehrere Spalten hinweg ist für die Aufrechterhaltung der Datenintegrität von entscheidender Bedeutung. In SQL Server können Sie dies erreichen, indem Sie eine eindeutige Einschränkung oder einen eindeutigen Index für eine bestimmte Spalte implementieren.
Ermitteln Sie den Bedarf an eindeutigen Einschränkungen
Das bereitgestellte Beispiel verdeutlicht die Notwendigkeit, eindeutige Kombinationen der Felder „PersonNumber“ und „Active“ in der Personentabelle sicherzustellen. Dies verhindert die mehrfache Eingabe einer bestimmten Person, wobei nur ein Datensatz pro eindeutiger aktiver Personennummer zulässig ist.
Eindeutige Einschränkung hinzufügen
Um diese Einschränkung durchzusetzen, können Sie eine eindeutige Einschränkung hinzufügen, indem Sie die folgende Syntax verwenden:
<code class="language-sql">ALTER TABLE dbo.yourtablename ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);</code>
Alternativ können Sie einen eindeutigen Index erstellen:
<code class="language-sql">CREATE UNIQUE INDEX uq_yourtablename ON dbo.yourtablename(column1, column2);</code>
Beide Methoden haben den gleichen Zweck, nämlich die Unterdrückung doppelter Datensätze basierend auf einer Kombination angegebener Spalten.
Bleiben Sie effizient
Wägen Sie unbedingt die Auswirkungen auf die Leistung ab, wenn Sie eindeutige Einschränkungen implementieren. Sie stellen zwar die Datenintegrität sicher, können aber auch zu Mehraufwand bei Einfügevorgängen führen, wenn Einschränkungen häufig verletzt werden. Erwägen Sie in diesem Fall die Verwendung eines INSTEAD OF-Triggers, um ungültige Einfügungen abzufangen und zu verhindern.
<code class="language-sql">CREATE TRIGGER dbo.BlockDuplicatesYourTable ON dbo.YourTable INSTEAD OF INSERT AS BEGIN SET NOCOUNT ON; IF NOT EXISTS (SELECT 1 FROM inserted AS i INNER JOIN dbo.YourTable AS t ON i.column1 = t.column1 AND i.column2 = t.column2 ) BEGIN INSERT dbo.YourTable(column1, column2, ...) SELECT column1, column2, ... FROM inserted; END ELSE BEGIN PRINT '插入操作被阻止,因为该组合已存在。'; -- 提供用户反馈 END END GO</code>
Denken Sie daran, dem Benutzer Feedback zu geben, wenn ein Trigger einen Einfügevorgang blockiert, um mögliche Unsicherheiten zu vermeiden.
Beispiel
Die Anwendung dieser Lösung auf das bereitgestellte Beispiel führt zu der folgenden Tabellenstruktur:
<code class="language-sql">CREATE TABLE dbo.Person ( ID INT IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(32), Active BIT, PersonNumber INT ); GO ALTER TABLE dbo.Person ADD CONSTRAINT uq_Person UNIQUE(PersonNumber, Active); GO</code>
Das Einfügen doppelter Datensätze basierend auf der Kombination „PersonNumber“ und „Active“ ist jetzt verboten, wie im folgenden Beispiel gezeigt:
<code class="language-sql">-- 成功 INSERT dbo.Person(Name, Active, PersonNumber) VALUES(N'foo', 1, 22); GO -- 成功 INSERT dbo.Person(Name, Active, PersonNumber) VALUES(N'foo', 0, 22); GO -- 失败 INSERT dbo.Person(Name, Active, PersonNumber) VALUES(N'foo', 1, 22); GO</code>
Das obige ist der detaillierte Inhalt vonWie erzwinge ich eindeutige Einschränkungen für mehrere Spalten in SQL Server?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!