SQL 唯一键约束

SQL 唯一约束可以确保表中列不会插入重复值。例如,如果我们想确保员工或客户只能使用一个电子邮件地址进行登录。那么我们可以为该列分配一个唯一约束。

它将接受一个 NULL 值。我们可以使用 Transact 查询和 Management Studio 来创建唯一约束。

使用 Management Studio 创建 SQL 唯一键约束

请转到对象资源管理器,使用 Management Studio 创建唯一约束。右键单击要创建约束的表(此处为 CustomerRecords),然后选择 Design 选项

Open Table in Design Mode 1

点击 Design 选项后,CustomerRecords 表将在设计模式下打开。如您所见,该表有 7 列,数据类型不同,我们的任务是为 Email Address 列添加唯一约束。

要创建 SQL 唯一约束,请右键单击列名,然后选择 Indexes/Keys.. 选项。

choose Indexes or Keys Option from Context menu 3

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

Click on the Add Button to Add New index or key 4

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

SQL Unique Key Constraint 5

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

Specify the index Column Name and Sort Order 6

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

Set Type as Unique Key Constraint 7

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

Assign a Name to it 8

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

SQL Unique Constraint Code 9

使用查询创建 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)

查看我们插入的数据。

See the distinct Records in Table  13

错误:向唯一键添加重复记录

我将向键列(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

它正在抛出错误。

Error Message 2627. 14

现有表上的 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 值。

Error Message 2627. Cannot insert duplicates 17

使用 Management Studio 删除唯一约束

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

DROP Unique Constraint 18

使用 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
Finding existing name 19

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

ALTER TABLE DROP Unique Constraint 20

如何为多个列添加唯一键?

您可以使用此查询为多个列添加唯一键。

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