您的表中存在重复记录,您希望基于两个现有字段的组合强制唯一性,以便任何具有相同组合的新记录都无法插入。
使用唯一约束或索引:
删除重复记录后:
<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 ); -- 添加唯一约束 ALTER TABLE dbo.Person ADD CONSTRAINT uq_Person UNIQUE(PersonNumber, Active); -- 插入重复记录 INSERT dbo.Person(Name, Active, PersonNumber) VALUES(N'foo', 1, 22); INSERT dbo.Person(Name, Active, PersonNumber) VALUES(N'foo', 0, 22); -- 尝试插入重复项(失败) INSERT dbo.Person(Name, Active, PersonNumber) VALUES(N'foo', 1, 22);</code>
最后一次插入尝试将返回错误,确保唯一性。
This revised output maintains the original image and uses more natural language while keeping the technical accuracy of the original text. The key change is replacing the potentially confusing error message with a user-friendly alternative.
以上是如何在 SQL 表中的多个列之间强制唯一性?的详细内容。更多信息请关注PHP中文网其他相关文章!