確保SQL Server列組合唯一性約束
資料庫表中可能出現多筆記錄具有相同列值的情況。為避免這種情況,您可以強制實施唯一性約束,要求特定列的組合在表內唯一。
例如,一個表格包含以下列:
要求確保只有一筆記錄具有PersonNumber和Active = 1的唯一組合。
建立唯一性約束
從表格中刪除任何重複記錄後,可以使用ALTER TABLE
語句或CREATE UNIQUE INDEX
語句新增唯一性限制。
ALTER TABLE
方法<code class="language-sql">ALTER TABLE dbo.yourtablename ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);</code>
CREATE UNIQUE INDEX
方法<code class="language-sql">CREATE UNIQUE INDEX uq_yourtablename ON dbo.yourtablename(column1, column2);</code>
處理重複插入
您可以主動檢查潛在衝突,而不是讓SQL Server透過傳回異常來處理重複插入。
為了防止異常中斷應用程序,您可以使用以下方法:
如果您希望在不修改應用程式的情況下處理重複插入,則可以建立一個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 'Did nothing.'; -- 或执行其他处理重复插入的逻辑 END END GO</code>
範例
以下範例示範了在列組合上建立唯一性限制並驗證其功能:
<code class="language-sql">USE tempdb; GO 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 -- 成功: 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>
此範例示範了唯一性限制如何防止具有相同PersonNumber和Active = 1組合的重複記錄。
以上是如何在SQL Server中對列組合進行唯一的約束?的詳細內容。更多資訊請關注PHP中文網其他相關文章!