在 SQL Server 中實施多列唯一約束
確保多列值的唯一組合對於維護數據完整性至關重要。在 SQL Server 中,您可以通過在指定的列上實現唯一約束或唯一索引來實現此目的。
識別對唯一約束的需求
提供的示例強調了需要確保 Person 表中 PersonNumber 和 Active 字段組合的唯一性。這可以防止多次輸入特定人員,其中每個唯一的活動 PersonNumber 只允許一條記錄。
添加唯一約束
要強制執行此限制,您可以使用以下語法添加唯一約束:
<code class="language-sql">ALTER TABLE dbo.yourtablename ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);</code>
或者,您可以創建一個唯一索引:
<code class="language-sql">CREATE UNIQUE INDEX uq_yourtablename ON dbo.yourtablename(column1, column2);</code>
這兩種方法都具有相同的目的,即根據指定列的組合禁止重複記錄。
保持效率
實施唯一約束時,務必權衡性能影響。雖然它們確保了數據完整性,但如果經常違反約束,它們也可能會導致插入操作的開銷。在這種情況下,請考慮使用 INSTEAD OF 觸發器來攔截並防止執行無效插入。
<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>
請記住,如果觸發器阻止了插入操作,請向用戶提供反饋,以防止潛在的不確定性。
示例
將此解決方案應用於提供的示例,將得到以下表結構:
<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>
現在禁止基於 PersonNumber 和 Active 組合插入重複記錄,如下例所示:
<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>
以上是如何在 SQL Server 中對多個列實作唯一約束?的詳細內容。更多資訊請關注PHP中文網其他相關文章!