PostgreSQL 教程: ALTER TABLE 修改表结构

九月 10, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的ALTER TABLE语句来修改表的结构。

PostgreSQL ALTER TABLE 语句简介

要更改现有表的结构,可以使用 PostgreSQL 的ALTER TABLE语句。

下面说明了ALTER TABLE语句的基本语法:

ALTER TABLE table_name action;

PostgreSQL 为您提供了许多操作:

要将新列添加到表中,请使用ALTER TABLE ADD COLUMN语句,如下:

ALTER TABLE table_name 
ADD COLUMN column_name datatype column_constraint;

要从表中删除列,请使用ALTER TABLE DROP COLUMN语句,如下:

ALTER TABLE table_name 
DROP COLUMN column_name;

要重命名列,请使用ALTER TABLE RENAME COLUMN TO语句,如下:

ALTER TABLE table_name 
RENAME COLUMN column_name 
TO new_column_name;

要更改列的默认值,您可以使用ALTER TABLE ALTER COLUMN SET DEFAULTDROP DEFAULT

ALTER TABLE table_name 
ALTER COLUMN column_name 
[SET DEFAULT value | DROP DEFAULT];

要更改NOT NULL约束,请使用ALTER TABLE ALTER COLUMN语句,如下:

ALTER TABLE table_name 
ALTER COLUMN column_name 
[SET NOT NULL| DROP NOT NULL];

要添加CHECK约束,请使用ALTER TABLE ADD CHECK语句:

ALTER TABLE table_name 
ADD CHECK expression;

一般来说,要向表添加约束,可以使用ALTER TABLE ADD CONSTRAINT语句,如下:

ALTER TABLE table_name 
ADD CONSTRAINT constraint_name constraint_definition;

重命名表,请使用ALTER TABLE RENAME TO语句,如下:

ALTER TABLE table_name 
RENAME TO new_table_name;

PostgreSQL ALTER TABLE 示例

让我们创建一个新表,名为links,用于练习ALTER TABLE语句。

DROP TABLE IF EXISTS links;

CREATE TABLE links (
   link_id serial PRIMARY KEY,
   title VARCHAR (512) NOT NULL,
   url VARCHAR (1024) NOT NULL
);

添加一个新列,名为active,请使用以下语句:

ALTER TABLE links
ADD COLUMN active boolean;

以下语句从links表中删除active列:

ALTER TABLE links 
DROP COLUMN active;

要将title列的名称更改为link_title,请使用以下语句:

ALTER TABLE links 
RENAME COLUMN title TO link_title;

以下语句向links表中添加一个名为target的新列:

ALTER TABLE links 
ADD COLUMN target VARCHAR(10);

要给links表中的target列设置默认值为_blank,请使用以下语句:

ALTER TABLE links 
ALTER COLUMN target
SET DEFAULT '_blank';

如果在插入新行links表时未指定target列的值,则target列将采用默认值_blank。例如:

INSERT INTO links (link_title, url)
VALUES('PostgreSQL Tutorial','https://www.rockdata.net/tutorial/');

以下语句从links表中查询数据:

SELECT * FROM links;

PostgreSQL ALTER TABLE SET DEFAULT

以下语句向target列添加一个CHECK约束,要求target列仅接受的值为:_self_blank_parent_top

ALTER TABLE links 
ADD CHECK (target IN ('_self', '_blank', '_parent', '_top'));

如果您尝试插入违反target列的CHECK约束的新行,PostgreSQL 将发出错误,如下例所示:

INSERT INTO links(link_title,url,target) 
VALUES('PostgreSQL','http://www.postgresql.org/','whatever');
ERROR:  new row for relation "links" violates check constraint "links_target_check"
DETAIL:  Failing row contains (2, PostgreSQL, http://www.postgresql.org/, whatever).

以下语句向links表的url列添加UNIQUE约束:

ALTER TABLE links 
ADD CONSTRAINT unique_url UNIQUE ( url );

以下语句尝试插入已存在的 url:

INSERT INTO links(link_title,url) 
VALUES('PostgreSQL','https://www.rockdata.net/tutorial/');

由于unique_url约束,它会导致错误:

ERROR:  duplicate key value violates unique constraint "unique_url"
DETAIL:  Key (url)=(https://www.rockdata.net/tutorial/) already exists.

以下语句将links表的名称更改为urls

ALTER TABLE links 
RENAME TO urls;

在本教程中,您学习了如何使用 PostgreSQL 的ALTER TABLE语句更改现有表的结构。