SQL Server 主键约束用于在表中实现数据完整性。当您在任何列上设置主键时,数据库引擎会自动在该列上创建唯一索引。在实际应用中,我们使用这些主键列来唯一标识行并快速有效地访问数据。
通常,每个表至少有一列包含唯一值,称为 SQL Server 主键列。例如,员工可能有员工 ID,订单可能有订单 ID 列。在进入主键示例之前,您应该记住以下几点:
- 一个表只能有一个主键。
- 因此,您不能在这些列中插入任何重复内容。
- 此列不允许 NULL 值。默认情况下,即使您在创建时忘记设置,这些列也会被指定为 NOT NULL。
- 如果您忘记将索引指定为聚集索引或非聚集索引,数据库引擎将默认分配聚集索引。
创建 SQL 主键约束
我们可以使用 Transact 查询和 Management Studio 来创建此主键约束。让我们看看如何使用 Transact 查询和 CREATE TABLE 语句来创建主键。在这里,我们将在创建时定义它。
CREATE TABLE [CustmerRecords] ( [CustomerKey] [int] NOT NULL PRIMARY KEY, [FirstName] [varchar](50) NOT NULL , [LastName] [varchar](50) NULL, [BirthDate] [date] NULL, [EmailAddress] [nvarchar](50) NULL, [Yearly Income] [money] NULL, [Profession] [nvarchar](100) NULL )
我们刚刚在列声明中添加了 SQL PRIMARY KEY 关键字。SSMS 足以为您创建它。
通过右键单击表 -> 脚本为 -> 创建到新的查询窗口选项,查看 SSMS 生成的内部代码。请参阅 SQL Server 中的 CREATE TABLE 文章。

在现有表上创建 SQL 主键
让我们将主键添加到现有表中。为此,我们创建一个新表。
CREATE TABLE [CustmerRecords] ( [CustomerKey] [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 )
现在让我将它添加到上面的表中。在此示例中,我们使用以下 ALTER TABLE 语句来修改表内容。然后,我们使用 ADD CONSTRAINT 语句添加此约束。
ALTER TABLE [CustmerRecords] ADD CONSTRAINT PK_CustmerRecords_CustomerKey PRIMARY KEY CLUSTERED (CustomerKey); GO

向约束列插入行
我将插入几行以检查主键约束的功能。
INSERT INTO [dbo].[CustmerRecords]
VALUES (1, 'Imran', 'Khan', '10-08-1985', 'abc@abc.com', 15900, 'Skilled Professional')
,(2, 'Doe', 'Lara', '10-08-1985', 'xyz@abc.com', 15000, 'Management')
,(3, 'Ramesh', 'Kumar', '10-08-1985', 'mnop@abc.com', 65000, 'Professional')
(3 row(s) affected)
让我们看看列中插入的数据。

向约束列插入重复值
上面的 INSERT 语句 将正常工作,因为我们为客户键插入了唯一的记录。所以,让我尝试将重复值插入 CustomerKey 列。请参考 唯一索引 文章。
-- Insert Duplicate into Constraint Column INSERT INTO [dbo].[CustmerRecords] VALUES (1, 'Tutorial', 'Gateway', '10-08-1985', 'myc@abc.com', 15900, 'Skilled Professional')

它抛出了一个错误:违反了约束“PK_CustmerRecords_CustomerKey”。主键抛出了错误,因为无法在对象“dbo.CustmerRecords”中插入重复键。重复值为 (1)。
让我向主键列插入 NULL 值。为此,我们添加了一个新的客户记录,其中除了 CustomerKey 列之外的所有值都为 NULL。
INSERT INTO [dbo].[CustmerRecords] VALUES (NULL, 'Tutorial', 'Gateway', '10-08-1995', 'myc@abc.com', 15900, 'Management')
这也抛出了一个错误。

使用 DROP CONSTRAINT 删除 SQL Server 主键
如果您知道约束名称,请使用 DROP CONSTRAINT 语句和 ALTER TABLE 语句。
ALTER TABLE [CustmerRecords] DROP CONSTRAINT PK_CustmerRecords_CustomerKey
如果您不知道名称,请使用第一个 SELECT 语句 来获取约束名称。
SELECT name FROM sys.key_constraints WHERE type = 'PK' AND OBJECT_NAME(parent_object_id) = N'CustmerRecords'; GO -- Delete or Drop ALTER TABLE [CustmerRecords] DROP CONSTRAINT PK_CustmerRecords_CustomerKey

输出 2

在设计器模式下打开 Customer records 表,以检查我们是否已成功将其从 CustomerKey 列中删除。如您所见,CustomerKey 列旁边没有键符号。
要使用 SSMS 创建 SQL 主键约束,请转到对象资源管理器。右键单击它并选择“设计”选项。
单击“设计”选项后,它将在设计模式下打开 Custrecords。它有 7 列,数据类型不同,我们的任务是为 Customerkey 列添加主键约束。

右键单击 CustomerKey 列,然后选择“设置主键”选项。

选择“设置”选项后,SSMS 将为您设置约束。

使用 Management Studio 修改 SQL 主键约束
请选择您的约束所在的表,然后转到“索引”文件夹。接下来,展开“索引”文件夹以查找可用的约束;右键单击它将打开上下文菜单。请根据要求选择选项。

注意:您无法使用查询修改约束。要修改现有约束,您必须先删除它,然后重新创建它。