利用唯一約束防止重複記錄
在數據庫操作中,經常需要確保特定列組合的唯一性。例如,考慮以下表格:
ID | Name | Active | PersonNumber
您可能需要強制實施一個唯一約束,以防止基於 PersonNumber 和 Active = 1 組合的重複項。這確保了不存在兩行具有相同的 PersonNumber 和 Active 狀態。
向現有表添加唯一約束
要向現有表添加唯一約束,您可以使用以下方法之一:
1. 使用唯一約束的 ALTER TABLE
ALTER TABLE dbo.yourtablename
ADD CONSTRAINT uq_yourtablename UNIQUE(column1, column2);
2. 創建唯一索引
CREATE UNIQUE INDEX uq_yourtablename
ON dbo.yourtablename(column1, column2);
使用觸發器防止重複插入
如果您希望在不依賴異常的情況下防止重複插入,可以使用 INSTEAD OF 觸發器。此觸發器會攔截插入嘗試,並且僅當行不違反唯一約束時才允許插入行:
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
示例:對 PersonNumber 和 Active 實施唯一性
以下示例演示如何對 Person 表中 PersonNumber 和 Active 的組合添加唯一約束:
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
現在,任何違反唯一約束的插入嘗試都將失敗並顯示錯誤消息,確保不存在具有相同 PersonNumber 和 Active 狀態的重複記錄。 PRINT '未執行任何操作。 '
語句替換了原文中的PRINT 'Did nothing.'
,使其更易於理解。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3