pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
ALTER TABLE — 更改一个表的定义
ALTER TABLE [ ONLY ]name[ * ] ADD [ COLUMN ]columntype[column_constraint[ ... ] ] ALTER TABLE [ ONLY ]name[ * ] DROP [ COLUMN ]column[ RESTRICT | CASCADE ] ALTER TABLE [ ONLY ]name[ * ] ALTER [ COLUMN ]column{ SET DEFAULTexpression| DROP DEFAULT } ALTER TABLE [ ONLY ]name[ * ] ALTER [ COLUMN ]column{ SET | DROP } NOT NULL ALTER TABLE [ ONLY ]name[ * ] ALTER [ COLUMN ]columnSET STATISTICSintegerALTER TABLE [ ONLY ]name[ * ] ALTER [ COLUMN ]columnSET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ALTER TABLE [ ONLY ]name[ * ] SET WITHOUT OIDS ALTER TABLE [ ONLY ]name[ * ] RENAME [ COLUMN ]columnTOnew_columnALTER TABLEnameRENAME TOnew_nameALTER TABLE [ ONLY ]name[ * ] ADDtable_constraintALTER TABLE [ ONLY ]name[ * ] DROP CONSTRAINTconstraint_name[ RESTRICT | CASCADE ] ALTER TABLEnameOWNER TOnew_ownerALTER TABLEnameCLUSTER ONindex_name
ALTER TABLE 更改一个现有表的定义。它有若干子形式:
ADD COLUMN这种形式使用与 CREATE TABLE 相同的语法向表添加一个新列。
DROP COLUMN这种形式从表中删除一个列。涉及该列的索引和表约束也将被自动删除。如果表外的任何对象依赖于该列(例如外键引用或视图),则需要指定 CASCADE。
SET/DROP DEFAULT这些形式为列设置或移除默认值。默认值只会应用于后续的 INSERT 命令;它们不会导致表中已有的行发生变化。也可以为视图创建默认值,这种情况下,在应用视图的 ON INSERT 规则之前,这些默认值会被插入到视图上的 INSERT 语句中。
SET/DROP NOT NULL这些形式更改列是否被标记为允许空值,或拒绝空值。只有当列不包含空值时,才能使用SET NOT NULL。
SET STATISTICS该形式为后续 ANALYZE 操作设置每列的统计信息收集目标。目标可以设置在 0 到 1000 范围内;也可以将其设置为 -1,以恢复使用系统默认的统计目标。
SET STORAGE该形式为列设置存储模式。这控制该列是内联保存还是保存在辅助表中,以及是否压缩数据。对于integer等定长值,必须使用PLAIN,数据以内联、未压缩方式保存。MAIN用于内联、可压缩的数据。EXTERNAL用于外部、未压缩的数据,而EXTENDED用于外部、压缩的数据。对于支持它的所有数据类型,EXTENDED是默认值。使用EXTERNAL(例如)会使对text列的子串操作更快,但代价是占用更多的存储空间。
SET WITHOUT OIDS这种形式从表中移除 oid 列。从表中移除 OID 并不会立即发生。OID 使用的空间会在行被更新时回收。如果不更新行,空间和 OID 的值都会无限期保留。这在语义上类似于 DROP COLUMN 过程。
RENAMERENAME 形式更改表(或索引、序列或视图)的名称,或者更改表中某一列的名称。存储的数据不受影响。
ADD table_constraint这种形式使用与CREATE TABLE相同的语法向一个表增加一个新约束。
DROP CONSTRAINT该形式删除表上的约束。目前,并不要求表上的约束具有唯一的名称,因此可能有多个约束与指定的名称匹配。所有这样的约束都将被删除。
OWNER该形式把表、索引、序列或视图的所有者更改为指定用户。
CLUSTER该形式为将来的 CLUSTER 操作标记表。
要使用 ALTER TABLE,你必须拥有该表;只有 ALTER TABLE OWNER 例外,它只能由超级用户执行。
name要更改的现有表的名称(可带模式限定)。如果在表名之前指定ONLY,则只更改该表。如果未指定ONLY,则更改该表及其所有后代表(如果有)。也可以在表名后指定*来指示要更改后代表,但在当前版本中这是默认行为。(在 7.1 之前的版本中,ONLY 是默认行为。默认行为可以通过更改配置参数 sql_inheritance 来改变。)
column新列或现有列的名称。
type新列的数据类型。
new_column现有列的新名称。
new_name表的新名称。
table_constraint表的新表约束。
constraint_name要删除的现有约束的名称。
new_owner表的新所有者的用户名。
index_name表将为之标记聚簇的索引名称。
CASCADE自动删除依赖于被删除列或约束的对象(例如引用该列的视图)。
RESTRICT如果存在任何依赖对象,则拒绝删除列或约束。这是默认行为。
关键字COLUMN只是噪声,可以省略。
在当前 ADD COLUMN 的实现中,不支持新列的默认值和 NOT NULL 子句。新列总是以所有值为空的状态产生。可以在之后使用 ALTER TABLE 的 SET DEFAULT 形式设置默认值。(你可能还想用 UPDATE 把已有的行更新为新默认值。)如果想要把列标记为非空,可以先为该列在所有行中输入非空值,然后使用 SET NOT NULL 形式。
DROP COLUMN形式不会从物理上删除列,而只是使其对 SQL 操作不可见。表后续的插入和更新操作会为该列存储空值。因此,删除列的速度很快,但不会立即减少表在磁盘上的大小,因为被删除列占用的空间不会被回收。随着现有行被更新,空间会逐渐回收。要立即回收空间,可以对所有行做一次虚拟的 UPDATE 然后清理(vacuum),例如:
UPDATE table SET col = col; VACUUM FULL table;
如果表有任何后代表,则不允许只在父表中添加或重命名列,而不对后代表执行相同操作。也就是说,ALTER TABLE ONLY会被拒绝。这确保后代表始终拥有与父表匹配的列。
只有当某个后代表中的列既不是从其他任何父表继承而来,也从未有过该列的独立定义时,递归的DROP COLUMN操作才会移除该后代表中的此列。非递归的DROP COLUMN(即ALTER TABLE ONLY ... DROP COLUMN)永远不会移除任何后代列,而只会把它们标记为独立定义,而非继承得到。
不允许更改系统目录表的任何部分。
有关有效参数的进一步说明,请参见CREATE TABLE。第 5 章中还有关于继承的更多信息。
要添加类型为varchar的列到表中:
ALTER TABLE distributors ADD COLUMN address varchar(30);
要从表中删除一列:
ALTER TABLE distributors DROP COLUMN address RESTRICT;
要重命名一个现有列:
ALTER TABLE distributors RENAME COLUMN address TO city;
重命名一个现有的表:
ALTER TABLE distributors RENAME TO suppliers;
为一列增加一个非空约束:
ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;
从一列移除一个非空约束:
ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;
要向一个表增加一个检查约束:
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);
要从一个表及其所有后代移除一个检查约束:
ALTER TABLE distributors DROP CONSTRAINT zipchk;
为一个表增加一个外键约束:
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address) MATCH FULL;
为一个表增加一个(多列)唯一约束:
ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);
为一个表增加一个自动命名的主键约束,注意一个表只能拥有一个主键:
ALTER TABLE distributors ADD PRIMARY KEY (dist_id);
ADD COLUMN 形式符合 SQL 标准,但不支持默认值和非空约束,如上所述。ALTER COLUMN 形式完全符合标准。
重命名表、列、索引、视图和序列的子句是 PostgreSQL 对 SQL 标准的扩展。
ALTER TABLE DROP COLUMN可以被用来删除一个表的唯一的列,从而留下一个零列的表。这是一种对 SQL 的扩展,SQL 中不允许零列的表。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。