提要:在本教程中,我们将展示什么是主键以及如何使用 SQL 语句来管理主键。

主键是在表中用来标识唯一一行的单个字段或多个字段的组合。

通过 PRIMARY KEY 约束来定义主键。技术上说,主键是非空约束唯一约束的组合。

每个数据表都可以有,且最多只能有一个主键。给每张表添加主键是一个良好的实践。当给表添加主键时,PostgreSQL 在用于定义主键的单个字段或一组字段上创建一个 btree 唯一索引。

创建新表时定义主键

通常,我们在使用 CREATE TABLE 语句创建新表的时候定义主键:

CREATE TABLE TABLE (
 column_1 data_type PRIMARY KEY,
 column_2 data_type,
 
);

下面的语句用于创建采购定单(PO)的头部信息的表,表名为 po_headers

CREATE TABLE po_headers (
 po_no INTEGER PRIMARY KEY,
 vendor_no INTEGER,
 description TEXT,
 shipping_address TEXT
);

po_nopo_headers 的主键,用来标识采购订单头部信息的唯一性。

可以使用多个字段来定义主键:

CREATE TABLE TABLE (
 column_1 data_type,
 column_2 data_type,
  
        PRIMARY KEY (column_1, column_2)
);

例如,下面的语句用于创建每笔采购订单的项目,它的主键由 po_noitem_no 两个字段组合而成:

CREATE TABLE po_items (
 po_no INTEGER,
 item_no INTEGER,
 product_no INTEGER,
 qty INTEGER,
 net_price NUMERIC,
 PRIMARY KEY (po_no, item_no)
);

如果没有显式地给主键指定名称,PostgreSQL 将使用 table_name_pk 的格式给主键自动命名。上例中,PostgreSQL 将给 po_items 的主键自动命名为 po_items_pk

如果要给主键命名,可以使用下面的语法:

CONSTRAINT constraint_name PRIMARY KEY(column_1, column_2,...);

给已存在的表添加主键

给已存在的表添加主键的场景很少见。如果要给已存在的表添加主键,可以使用如下语法:

ALTER TABLE TABLE ADD PRIMARY KEY (column_1, column_2);

下面的语句创建了一个没有主键的 products 表:

CREATE TABLE products (
 product_no INTEGER,
 description TEXT,
 product_cost NUMERIC
);

假设,现在需要给这张表添加主键,可以使用下面的语句:

ALTER TABLE products 
ADD PRIMARY KEY (product_no);

如何给已存在的表添加自增主键

假设有一张 vendors 表,它没有主键:

CREATE TABLE vendors (name VARCHAR(255));

现在经过 INSERT 语句添加几条记录:

INSERT INTO vendors (NAME)
VALUES
 ('Microsoft'),
 ('IBM'),
 ('Apple'),
 ('Samsung');

现在,我们想给这张表添加一个 id 字段。这个字段是自增的主键,可以使用下面的语句:

ALTER TABLE vendors ADD COLUMN id SERIAL PRIMARY KEY;

移除主键

要删除已存在的主键,可以使用下面的语法:

ALTER TABLE TABLE DROP CONSTRAINT primary_key_constraint;

下例是删除 products 表的主键:

ALTER TABLE table
DROP CONSTRAINT products_pkey;
上一篇:PostgreSQL 外键