SQL 主键

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 along with Primary Key Constraint 6

在现有表上创建 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
Alter Table Add constraint Primary Key Clustered 7

向约束列插入行

我将插入几行以检查主键约束的功能。

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)

让我们看看列中插入的数据。

View or select records from Column 9

向约束列插入重复值

上面的 INSERT 语句 将正常工作,因为我们为客户键插入了唯一的记录。所以,让我尝试将重复值插入 CustomerKey 列。请参考 唯一索引 文章。

-- Insert Duplicate into Constraint Column
INSERT INTO [dbo].[CustmerRecords] 
VALUES (1, 'Tutorial', 'Gateway', '10-08-1985', 'myc@abc.com', 15900, 'Skilled Professional')
Insert Duplicate records into Primary Key constraint column 10

它抛出了一个错误:违反了约束“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')

这也抛出了一个错误。

Insert Null values into column error 11

使用 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
Delete or Drop Primary Key constraint 13

输出 2

Drop query 14

在设计器模式下打开 Customer records 表,以检查我们是否已成功将其从 CustomerKey 列中删除。如您所见,CustomerKey 列旁边没有键符号。

要使用 SSMS 创建 SQL 主键约束,请转到对象资源管理器。右键单击它并选择“设计”选项。

单击“设计”选项后,它将在设计模式下打开 Custrecords。它有 7 列,数据类型不同,我们的任务是为 Customerkey 列添加主键约束。

Table Designer 2

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

Set Primary Key option 3

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

使用 Management Studio 修改 SQL 主键约束

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

Rename Option to modify the existing 12

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