PostgreSQL 教程: 主键约束

九月 13, 2023

摘要:在本教程中,我们将向您展示主键是什么以及如何通过 SQL 语句管理 PostgreSQL 主键约束。

主键是用于唯一标识表中的行的一列或一组列。

您可以通过主键约束来定义主键。从技术上讲,主键约束是非空约束UNIQUE 约束的组合。

一张表只能有一个主键。向每个表添加主键是一个很好的做法。当您向表添加主键时,PostgreSQL 会在用于定义主键的列或一组列上创建唯一的 B 树索引。

创建表时定义主键

通常,当我们使用 CREATE TABLE 语句定义表的结构时,我们会向表添加主键。

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

以下语句创建一个名为po_headers的采购订单 (PO) 标头表。

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

po_nopo_headers表的主键,唯一标识po_headers表中的采购订单。

如果主键由两列或更多列组成,则可以按如下方式定义主键约束:

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

例如,以下语句创建采购订单行项目表,其主键是采购订单编号 (po_no) 和行项目编号 (item_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 将为主键约束分配一个默认名称。默认情况下,PostgreSQL 使用table-name_pkey作为主键约束的默认名称。在此示例中,PostgreSQL 使用名称po_items_pkeypo_items表创建主键约束。

如果您想指定主键约束的名称,请使用CONSTRAINT子句,如下:

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

更改现有表结构时定义主键

通常很少为现有表定义主键。如果必须这样做,可以使用 ALTER TABLE 语句添加主键约束。

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

以下语句创建一个名为products的表,但未定义任何主键。

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

假设要给products表添加主键约束,可以执行以下语句:

ALTER TABLE products 
ADD PRIMARY KEY (product_no);

如何给现有表添加自增主键

假设,我们有一个没有任何主键的vendors表。

CREATE TABLE vendors (name VARCHAR(255));

我们使用 INSERT 语句vendors表中添加几行:

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

为了验证插入操作,我们使用以下 SELECT 语句从vendors表中查询数据:

SELECT * FROM vendors;

vendors table

现在,如果我们想在vendors表中添加一个名为id的主键,并且id字段自动递增 1,我们使用以下语句:

ALTER TABLE vendors ADD COLUMN ID SERIAL PRIMARY KEY;

我们再检查一下vendors表。

SELECT id, name FROM vendors;

vendors table with primary key

删除主键

要删除现有的主键约束,您还可以使用具有以下语法的ALTER TABLE语句:

ALTER TABLE table_name DROP CONSTRAINT primary_key_constraint;

例如,要删除products表的主键约束,可以使用以下语句:

ALTER TABLE products
DROP CONSTRAINT products_pkey;

在本教程中,您学习了如何使用CREATE TABLEALTER TABLE语句添加和删除主键约束。