SQL 唯一约束可以确保表中列不会插入重复值。例如,如果我们想确保员工或客户只能使用一个电子邮件地址进行登录。那么我们可以为该列分配一个唯一约束。
它将接受一个 NULL 值。我们可以使用 Transact 查询和 Management Studio 来创建唯一约束。
使用 Management Studio 创建 SQL 唯一键约束
请转到对象资源管理器,使用 Management Studio 创建唯一约束。右键单击要创建约束的表(此处为 CustomerRecords),然后选择 Design 选项

点击 Design 选项后,CustomerRecords 表将在设计模式下打开。如您所见,该表有 7 列,数据类型不同,我们的任务是为 Email Address 列添加唯一约束。
要创建 SQL 唯一约束,请右键单击列名,然后选择 Indexes/Keys.. 选项。

选择 SQL Server Indexes/Keys.. 选项后,将打开一个新窗口。要创建新键,请单击 Add 按钮。

单击 Add 按钮后,它将创建一个具有默认名称的索引。接下来,请导航到 General 部分以选择要应用的列。

我们想在 Email Address 列上使用唯一键约束,因此我们选择该列。

接下来,请将 Type 从默认的 Index 更改为 Unique Key。

最后,如果您想更改标识名称,请使用 Name 属性进行更改。完成后,单击 Close 按钮,这将为您在 Customer records 表上创建 SQL 唯一键约束。

让我们通过右键单击表 -> script as -> create to new query window 选项来看看 Management Studio 生成的内部代码。

使用查询创建 SQL 唯一约束
如何使用 Transact 语句创建唯一键?我们可以使用多种选项通过查询来创建。如果您不想为键分配任何特定名称,请使用以下选项。请参考 Create Table 文章。
CREATE TABLE [dbo].[CustomerRecords]( [CustKey] [int] NOT NULL UNIQUE, [FirstName] [varchar](50) NOT NULL, [LastName] [varchar](50) NULL, [BirthDate] [date] NULL, [EmailAddress] [nvarchar](50) NULL, [Yearly Income] [money] NULL, [Profession] [nvarchar](100) NULL ) GO
Messages
-------
Command(s) completed successfully.
创建具有有意义名称的唯一键
它允许您分配一个有意义的名称。
CREATE TABLE [dbo].[CustomerRecords]( [CustKey] [int] NOT NULL, [FirstName] [varchar](50) NOT NULL, [LastName] [varchar](50) NULL, [BirthDate] [date] NULL, [EmailAddress] [nvarchar](50) NULL, [Yearly Income] [money] NULL, [Profession] [nvarchar](100) NULL, CONSTRAINT UC_CustomerRecords_CustKey UNIQUE (CustKey) ) GO
我们刚刚将其添加到 CustKey 列。
Messages
-------
Command(s) completed successfully.
使用 SQL 唯一键约束向表中插入记录
让我使用 INSERT 语句 向表中插入一个值。
-- Inserting Values
INSERT INTO [dbo].[CustomerRecords]
([CustKey], [FirstName], [LastName], [BirthDate], [EmailAddress], [Yearly Income], [Profession])
VALUES
(1, 'Tutorial', 'Gateway', '10-04-1995', 'ab@abd.com', 92500, 'Admin'),
(2, 'Steve', 'Lara', '10-04-1989', 'abcd@abcd.com', 19500, 'Software Developer'),
(3, 'Jack', 'Smith', '10-08-1985', 'xyz@abcd.com', 25000, 'Manager' ),
(4, 'Ramesh', 'Kumar', '10-05-1983', 'mnopq@abcs.com', 75000, 'Sales Manager')
GO
Messages
-------
(4 row(s) affected)
查看我们插入的数据。

错误:向唯一键添加重复记录
我将向键列(CustKey)添加重复值
INSERT INTO [dbo].[CustomerRecords]
([CustKey], [FirstName], [LastName], [BirthDate], [EmailAddress], [Yearly Income], [Profession])
VALUES
(1, 'Gateway', 'Tutorial', '10-04-1995', 'abcdefg@tutorialgateway.org', 92500, 'Admin')
GO
它正在抛出错误。

现有表上的 SQL Server 唯一约束
要向现有表添加唯一约束,我们使用 Alter Table 语句来修改表内容。然后使用 ADD UNIQUE 语句添加此约束。
ALTER TABLE[CustomerRecords] ADD UNIQUE([EmailAddress])
或者,使用以下唯一约束方法添加有意义的名称。
ALTER TABLE[CustomerRecords] ADD CONSTRAINT UC_CustomerRecords_EmailAddress UNIQUE([EmailAddress])
让我们通过右键单击表 -> script as -> create to new query window 选项来看看它生成的内部代码。

向唯一键约束表列中插入 NULL 值
让我们看看将 NULL 值插入唯一键列时会发生什么。
-- Inserting Values
INSERT INTO [dbo].[CustomerRecords]
([CustKey], [FirstName], [LastName], [BirthDate], [Yearly Income], [Profession])
VALUES
(5, 'Gateway', 'Tutorial', '10-04-1995', 92500, 'Admin')
GO

我将向具有约束的 Email Address 列再插入一个 NULL 值。
INSERT INTO [dbo].[CustomerRecords]
([CustKey], [FirstName], [LastName], [BirthDate], [Yearly Income], [Profession])
VALUES
(6, 'TutorialGateway', 'Website', '12-05-1995', 92500, 'Admin')
GO
它正在抛出错误,因为它只接受一个 NULL 值。

使用 Management Studio 删除唯一约束
右键单击表名,然后单击 Design 选项。接下来,选择 Indexes/Keys.. 选项,选择要删除的约束,然后单击 Delete 按钮。

使用 Drop constraint 删除 SQL 唯一约束
如果您知道名称,请使用 DROP Constraint 和 ALTER TABLE 语句。
ALTER TABLE [dbo].[CustomerRecords] DROP CONSTRAINT UC_CustomerRecords_CustKey; GO
如果您不知道名称,请使用下面的 SELECT Statement 来获取约束名称。
-- To find the Name SELECT name FROM sys.key_constraints WHERE OBJECT_NAME(parent_object_id) = N'CustomerRecords'; GO -- Delete or Drop ALTER TABLE [CustomerRecords] DROP CONSTRAINT UC_CustomerRecords_CustKey; GO

然后您可以使用 ALTER TABLE 语句来删除约束。

如何为多个列添加唯一键?
您可以使用此查询为多个列添加唯一键。
CREATE TABLE [dbo].[CustomerRecords]( [CustKey] [int] NOT NULL, [FirstName] [varchar](50) NOT NULL, [LastName] [varchar](50) NULL, [BirthDate] [date] NULL, [EmailAddress] [nvarchar](50) NULL, [Yearly Income] [money] NULL, [Profession] [nvarchar](100) NULL, CONSTRAINT UC_CustomerRecords_CustKeyEmailID UNIQUE (CustKey, EmailAddress) ) GO