Skip to content

SQL Primary Key

PRIMARY KEY(主键)约束是关系型数据库中的一个基本概念。它唯一地标识表中的每一条记录(行)。

主键的主要特点:

  • **唯一性:**主键值在表中所有行中必须是唯一的。不存在两行具有相同的主键值。
  • **非空性:**主键列不能包含 NULL 值。每一行都必须有主键的值。
  • **每表只有一个主键:**一个表只能有一个主键。但是,这个主键可以由一个或多个列组成(这称为复合主键,composite primary key)。

对于大多数表来说,拥有一个主键是最佳实践,因为它能确保数据完整性,并提供一种可靠的方式来引用特定的行。

定义 PRIMARY KEY 约束(使用 CREATE TABLE 时)

Section titled “定义 PRIMARY KEY 约束(使用 CREATE TABLE 时)”

在使用 CREATE TABLE 语句创建表时,你可以定义主键。

方法 1:内联定义(适用于单列主键)

以下 SQL 在创建 “Employees” 表时,为 “EmployeeID” 列创建了一个 PRIMARY KEY。这种语法得到广泛支持。

CREATE TABLE Employees ( EmployeeID INT NOT NULL PRIMARY KEY, LastName VARCHAR(255) NOT NULL, FirstName VARCHAR(255), Email VARCHAR(255) UNIQUE, — 可选:Email 也应是唯一的 HireDate DATE );

方法 2:表级约束定义(适用于单列或多列主键,并允许命名约束)

这种语法也得到广泛支持,并且对于复合主键或如果你想明确命名约束时是必需的。

CREATE TABLE OrderDetails ( OrderID INT NOT NULL, ProductID INT NOT NULL, Quantity INT, UnitPrice DECIMAL(10, 2), CONSTRAINT PK_OrderDetail PRIMARY KEY (OrderID, ProductID) — 复合主键 );

在 OrderDetails 示例中,主键 PK_OrderDetail 由两个列组成:OrderID 和 ProductID。这两列的组合对于每一行必须是唯一的。

注意:命名约束(如 CONSTRAINT pk_PersonID)的具体语法是标准的,但如果遇到问题,请查阅你的 RDBMS(关系型数据库管理系统)文档。

添加 PRIMARY KEY 约束(使用 ALTER TABLE 时)

Section titled “添加 PRIMARY KEY 约束(使用 ALTER TABLE 时)”

如果表已存在,你可以使用 ALTER TABLE 语句添加 PRIMARY KEY 约束。

对于单列主键:

ALTER TABLE Employees ADD PRIMARY KEY (EmployeeID);

为现有表命名约束和/或定义复合主键:

ALTER TABLE OrderDetails ADD CONSTRAINT PK_OrderDetail_Alt PRIMARY KEY (OrderID, ProductID);

重要提示:向现有表添加主键时,用作主键的列必须已定义为 NOT NULL 且必须包含唯一值。如果这些条件不满足,ALTER TABLE 语句将执行失败。

要删除现有的 PRIMARY KEY 约束,请使用 ALTER TABLE 语句。具体语法在不同数据库系统之间可能略有差异,尤其是在标识约束的方式上。

MySQL:

ALTER TABLE Employees DROP PRIMARY KEY;

SQL Server / Oracle / PostgreSQL(以及其他需要约束名称的数据库系统):

首先,如果你没有明确定义主键约束的名称,可能需要查找它。通常可以通过查询系统目录表(例如 information_schema.table_constraints)找到。假设约束名称是 PK_OrderDetail:

ALTER TABLE OrderDetails DROP CONSTRAINT PK_OrderDetail;

删除约束的具体语法,尤其是当约束名称是系统生成时,请务必查阅你的特定数据库系统的文档。