确保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中文网其他相关文章!