首页 > 数据库 > mysql教程 > 如何在 SQL 表中的多个列之间强制唯一性?

如何在 SQL 表中的多个列之间强制唯一性?

Barbara Streisand
发布: 2025-01-24 23:47:09
原创
448 人浏览过

How to Enforce Uniqueness Across Multiple Columns in a SQL Table?

强制多个列的唯一性

问题陈述

您的表中存在重复记录,您希望基于两个现有字段的组合强制唯一性,以便任何具有相同组合的新记录都无法插入。

解决方法

使用唯一约束或索引:

删除重复记录后:

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板