↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / SQL 命令 / 表与视图

SQL COMMAND · 表与视图

ALTER TABLE

更改一个表的定义

change the definition of a table

ALTER表与视图引入 6.4(基线)现存至 20 devel26 次语法变更

动词
ALTER
对象
TABLE
引入版本
6.4(基线)
状态
现存
语法变更次数
26
手册小节数
6

本站手册 · 18官方文档 ↗

版本轨迹

相对 PostgreSQL 17:语法概要新增 12 行,移除 0 行。

语法铁道图 PostgreSQL 18

沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。

ALTER TABLE IF EXISTS ONLY name * action ,
ALTER TABLE · 语法 2
ALTER TABLE IF EXISTS ONLY name * RENAME COLUMN column_name TO new_column_name
ALTER TABLE · 语法 3
ALTER TABLE IF EXISTS ONLY name * RENAME CONSTRAINT constraint_name TO new_constraint_name
ALTER TABLE · 语法 4
ALTER TABLE IF EXISTS name RENAME TO new_name
ALTER TABLE · 语法 5
ALTER TABLE IF EXISTS name SET SCHEMA new_schema
ALTER TABLE · 语法 6
ALTER TABLE ALL IN TABLESPACE name OWNED BY role_name , SET TABLESPACE new_tablespace NOWAIT
ALTER TABLE · 语法 7
ALTER TABLE IF EXISTS name ATTACH PARTITION partition_name FOR VALUES partition_bound_spec DEFAULT
ALTER TABLE · 语法 8
ALTER TABLE IF EXISTS name DETACH PARTITION partition_name CONCURRENTLY FINALIZE
action
ADD COLUMN IF NOT EXISTS column_name data_type COLLATE collation column_constraint DROP COLUMN IF EXISTS column_name RESTRICT CASCADE ALTER COLUMN column_name SET DATA TYPE data_type COLLATE collation USING expression ALTER COLUMN column_name SET DEFAULT expression ALTER COLUMN column_name DROP DEFAULT ALTER COLUMN column_name SET DROP NOT NULL ALTER COLUMN column_name SET EXPRESSION AS ( expression ) ALTER COLUMN column_name DROP EXPRESSION IF EXISTS ALTER COLUMN column_name ADD GENERATED ALWAYS BY DEFAULT AS IDENTITY ( sequence_options ) ALTER COLUMN column_name SET GENERATED ALWAYS BY DEFAULT SET sequence_option RESTART WITH restart ALTER COLUMN column_name DROP IDENTITY IF EXISTS ALTER COLUMN column_name SET STATISTICS integer DEFAULT ALTER COLUMN column_name SET ( attribute_option = value , ) ALTER COLUMN column_name RESET ( attribute_option , ) ALTER COLUMN column_name SET STORAGE PLAIN EXTERNAL EXTENDED MAIN DEFAULT ALTER COLUMN column_name SET COMPRESSION compression_method ADD table_constraint NOT VALID ADD table_constraint_using_index ALTER CONSTRAINT constraint_name DEFERRABLE NOT DEFERRABLE INITIALLY DEFERRED INITIALLY IMMEDIATE ENFORCED NOT ENFORCED ALTER CONSTRAINT constraint_name INHERIT NO INHERIT VALIDATE CONSTRAINT constraint_name DROP CONSTRAINT IF EXISTS constraint_name RESTRICT CASCADE DISABLE TRIGGER trigger_name ALL USER ENABLE TRIGGER trigger_name ALL USER ENABLE REPLICA TRIGGER trigger_name ENABLE ALWAYS TRIGGER trigger_name DISABLE RULE rewrite_rule_name ENABLE RULE rewrite_rule_name ENABLE REPLICA RULE rewrite_rule_name ENABLE ALWAYS RULE rewrite_rule_name DISABLE ROW LEVEL SECURITY ENABLE ROW LEVEL SECURITY FORCE ROW LEVEL SECURITY NO FORCE ROW LEVEL SECURITY CLUSTER ON index_name SET WITHOUT CLUSTER SET WITHOUT OIDS SET ACCESS METHOD new_access_method DEFAULT SET TABLESPACE new_tablespace SET LOGGED UNLOGGED SET ( storage_parameter = value , ) RESET ( storage_parameter , ) INHERIT parent_table NO INHERIT parent_table OF type_name NOT OF OWNER TO new_owner CURRENT_ROLE CURRENT_USER SESSION_USER REPLICA IDENTITY DEFAULT USING INDEX index_name FULL NOTHING
partition_bound_spec
IN ( partition_bound_expr , ) FROM ( partition_bound_expr MINVALUE MAXVALUE , ) TO ( partition_bound_expr MINVALUE MAXVALUE , ) WITH ( MODULUS numeric_literal , REMAINDER numeric_literal )
column_constraint
CONSTRAINT constraint_name NOT NULL NO INHERIT NULL CHECK ( expression ) NO INHERIT DEFAULT default_expr GENERATED ALWAYS AS ( generation_expr ) STORED VIRTUAL GENERATED ALWAYS BY DEFAULT AS IDENTITY ( sequence_options ) UNIQUE NULLS NOT DISTINCT index_parameters PRIMARY KEY index_parameters REFERENCES reftable ( refcolumn ) MATCH FULL MATCH PARTIAL MATCH SIMPLE ON DELETE referential_action ON UPDATE referential_action DEFERRABLE NOT DEFERRABLE INITIALLY DEFERRED INITIALLY IMMEDIATE ENFORCED NOT ENFORCED
table_constraint
CONSTRAINT constraint_name CHECK ( expression ) NO INHERIT NOT NULL column_name NO INHERIT UNIQUE NULLS NOT DISTINCT ( column_name , , column_name WITHOUT OVERLAPS ) index_parameters PRIMARY KEY ( column_name , , column_name WITHOUT OVERLAPS ) index_parameters EXCLUDE USING index_method ( exclude_element WITH operator , ) index_parameters WHERE ( predicate ) FOREIGN KEY ( column_name , , PERIOD column_name ) REFERENCES reftable ( refcolumn , , PERIOD refcolumn ) MATCH FULL MATCH PARTIAL MATCH SIMPLE ON DELETE referential_action ON UPDATE referential_action DEFERRABLE NOT DEFERRABLE INITIALLY DEFERRED INITIALLY IMMEDIATE ENFORCED NOT ENFORCED
table_constraint_using_index
CONSTRAINT constraint_name UNIQUE PRIMARY KEY USING INDEX index_name DEFERRABLE NOT DEFERRABLE INITIALLY DEFERRED INITIALLY IMMEDIATE
index_parameters
INCLUDE ( column_name , ) WITH ( storage_parameter = value , ) USING INDEX TABLESPACE tablespace_name
exclude_element
column_name ( expression ) COLLATE collation opclass ( opclass_parameter = value , ) ASC DESC NULLS FIRST LAST
referential_action
NO ACTION RESTRICT CASCADE SET NULL ( column_name , ) SET DEFAULT ( column_name , )

锁模式 PostgreSQL 18

具体锁模式取决于操作变体、目标对象和执行阶段;同一命令可同时取得表锁与行锁。查看完整冲突矩阵

ACCESS SHARE · 表级锁

ALTER TABLE … NO INHERIT(父表):检查并解除继承关系时,在父表上取得 ACCESS SHARE;被修改的子表另取 ACCESS EXCLUSIVE。

ROW SHARE · 表级锁

ALTER TABLE … VALIDATE CONSTRAINT(外键被引用表):验证外键时,被引用表另取 ROW SHARE;正在验证约束的表取 SHARE UPDATE EXCLUSIVE。

SHARE UPDATE EXCLUSIVE · 表级锁

ALTER TABLE … ALTER COLUMN … SET STATISTICS:修改列统计目标。

ALTER TABLE … ALTER COLUMN … SET (n_distinct = …):修改列统计选项;RESET 同样适用。

ALTER TABLE … CLUSTER ON:设置后续聚簇使用的索引;此命令本身不重写表。

ALTER TABLE … SET WITHOUT CLUSTER:清除聚簇索引标记。

ALTER TABLE … VALIDATE CONSTRAINT:在当前表上验证约束;外键验证还需要访问被引用表。

ALTER TABLE … ATTACH PARTITION(父表):父表锁级别逐版本解析;待挂载分区另取 ACCESS EXCLUSIVE。PostgreSQL 11 起如有默认分区,也需锁定默认分区。

ALTER TABLE … DETACH PARTITION … FINALIZE(父表):完成中断的并发分离;被分离分区另取 ACCESS EXCLUSIVE。

ALTER TABLE … SET / RESET (fillfactor = …):表存储参数按参数定义选择锁;fillfactor 可用 SHARE UPDATE EXCLUSIVE。

ALTER TABLE … SET / RESET (autovacuum_* = …):表的自动清理存储参数使用 SHARE UPDATE EXCLUSIVE。

ALTER TABLE … SET / RESET (toast.autovacuum_* = …):这里给出 TOAST 自动清理参数;不存在笼统的 SET TOAST 子命令,其他参数按具体定义选择锁。

ALTER TABLE … DETACH PARTITION … CONCURRENTLY(父表):PostgreSQL 14 起,分两个事务进行;父表使用 SHARE UPDATE EXCLUSIVE,等待使用分区的事务结束后进入完成阶段。

ALTER TABLE … DETACH PARTITION … CONCURRENTLY(分区,第一阶段):第一阶段父表与分区使用 SHARE UPDATE EXCLUSIVE;提交并等待后再升级分区锁。

ALTER TABLE … INHERIT(父表):在新指定的继承父表上取得 SHARE UPDATE EXCLUSIVE;被修改的子表另取 ACCESS EXCLUSIVE。

SHARE ROW EXCLUSIVE · 表级锁

ALTER TABLE … ENABLE / DISABLE TRIGGER:启停触发器,包括 USER / ALL / REPLICA / ALWAYS 相应形式。

ALTER TABLE … ADD FOREIGN KEY [NOT VALID](引用表):引用方与被引用方都取得 SHARE ROW EXCLUSIVE;NOT VALID 只省略已有数据的初始验证,不免除这个锁。

ALTER TABLE … ADD FOREIGN KEY [NOT VALID](被引用表):与引用方同样取得 SHARE ROW EXCLUSIVE,不能把被引用表记为只有 ACCESS SHARE。

ACCESS EXCLUSIVE · 表级锁

ALTER TABLE … ADD COLUMN:是否需要重写取决于版本与默认表达式;避免重写并不降低这里的锁级别。

ALTER TABLE … DROP COLUMN:删除列并改变表结构。

ALTER TABLE … ALTER COLUMN … SET / DROP DEFAULT:修改列默认值。

ALTER TABLE … ALTER COLUMN … TYPE:改变列类型;是否重写不改变这里列出的锁要求。

ALTER TABLE … ALTER COLUMN … SET STORAGE:修改列存储策略。

ALTER TABLE … ALTER COLUMN … SET COMPRESSION:修改列压缩方法。

ALTER TABLE … SET TABLESPACE:移动表的表空间。

ALTER TABLE … SET LOGGED / UNLOGGED:切换日志持久性。

ALTER TABLE … SET ACCESS METHOD:修改表访问方法。

ALTER TABLE … DROP CONSTRAINT:删除约束及可能依赖的索引。

ALTER TABLE … ALTER CONSTRAINT:修改约束属性。

ALTER TABLE … ALTER COLUMN … SET NOT NULL:设置非空约束。

ALTER TABLE … ALTER COLUMN … DROP NOT NULL:移除非空约束。

ALTER TABLE … ENABLE / DISABLE RULE:启停规则。

ALTER TABLE … ENABLE / DISABLE ROW LEVEL SECURITY:启停行级安全策略。

ALTER TABLE … FORCE / NO FORCE ROW LEVEL SECURITY:改变表所有者是否受行级安全策略约束。

ALTER TABLE … ALTER COLUMN … DROP EXPRESSION:移除生成列表达式。

ALTER TABLE … ALTER COLUMN … SET EXPRESSION:设置生成列表达式。

ALTER TABLE … ALTER COLUMN … SET GENERATED / RESTART / SET sequence_option:修改标识列属性或其隐式序列选项;不是名为 SET SEQUENCE 的独立子命令。

ALTER TABLE … ALTER COLUMN … ADD GENERATED … AS IDENTITY:为列增加标识属性。

ALTER TABLE … ALTER COLUMN … DROP IDENTITY:移除标识属性。

ALTER TABLE … INHERIT / NO INHERIT(子表):此处列出被修改的子表;父表另按继承处理锁定。

ALTER TABLE … OWNER TO:修改表所有者。

ALTER TABLE … REPLICA IDENTITY:修改复制标识。

ALTER TABLE … RENAME:重命名表、列或约束。

ALTER TABLE … ADD CONSTRAINT(CHECK / UNIQUE / PRIMARY KEY / EXCLUDE):普通添加约束;ADD FOREIGN KEY 使用较弱的 SHARE ROW EXCLUSIVE。

ALTER TABLE … ATTACH PARTITION(待挂载分区):待挂载表需 ACCESS EXCLUSIVE;合适的 CHECK 约束可以免除验证扫描,但不免除对这张表的锁。

ALTER TABLE … ATTACH PARTITION(默认分区):PostgreSQL 11 起如有默认分区,对其取得 ACCESS EXCLUSIVE;合适 CHECK 约束可免扫描,不能免除默认分区本身的锁。递归子分区另按验证需要处理。

ALTER TABLE … DETACH PARTITION(父表):未使用 CONCURRENTLY 的常规分离。

ALTER TABLE … DETACH PARTITION(被分离分区):常规分离在被分离分区上取得 ACCESS EXCLUSIVE。

ALTER TABLE … DETACH PARTITION … CONCURRENTLY(分区,完成阶段):第二阶段在被分离分区取得 ACCESS EXCLUSIVE;不允许存在默认分区时使用 CONCURRENTLY。

语法概要

相对 PostgreSQL 17 新增 12 行,移除 0 行;新增行以绿色标记。

ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
action [, ... ]
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
RENAME [ COLUMN ] column_name TO new_column_name
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
RENAME CONSTRAINT constraint_name TO new_constraint_name
ALTER TABLE [ IF EXISTS ] name
RENAME TO new_name
ALTER TABLE [ IF EXISTS ] name
SET SCHEMA new_schema
ALTER TABLE ALL IN TABLESPACE name [ OWNED BY role_name [, ... ] ]
SET TABLESPACE new_tablespace [ NOWAIT ]
ALTER TABLE [ IF EXISTS ] name
ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | DEFAULT }
ALTER TABLE [ IF EXISTS ] name
DETACH PARTITION partition_name [ CONCURRENTLY | FINALIZE ]

其中action为以下之一:

ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]
ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]
ALTER [ COLUMN ] column_name SET DEFAULT expression
ALTER [ COLUMN ] column_name DROP DEFAULT
ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL
ALTER [ COLUMN ] column_name SET EXPRESSION AS ( expression )
ALTER [ COLUMN ] column_name DROP EXPRESSION [ IF EXISTS ]
ALTER [ COLUMN ] column_name ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ]
ALTER [ COLUMN ] column_name { SET GENERATED { ALWAYS | BY DEFAULT } | SET sequence_option | RESTART [ [ WITH ] restart ] } [...]
ALTER [ COLUMN ] column_name DROP IDENTITY [ IF EXISTS ]
ALTER [ COLUMN ] column_name SET STATISTICS { integer | DEFAULT }
ALTER [ COLUMN ] column_name SET ( attribute_option = value [, ... ] )
ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] )
ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }
ALTER [ COLUMN ] column_name SET COMPRESSION compression_method
ADD table_constraint [ NOT VALID ]
ADD table_constraint_using_index
ALTER CONSTRAINT constraint_name [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ]
ALTER CONSTRAINT constraint_name [ INHERIT | NO INHERIT ]
VALIDATE CONSTRAINT constraint_name
DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ]
DISABLE TRIGGER [ trigger_name | ALL | USER ]
ENABLE TRIGGER [ trigger_name | ALL | USER ]
ENABLE REPLICA TRIGGER trigger_name
ENABLE ALWAYS TRIGGER trigger_name
DISABLE RULE rewrite_rule_name
ENABLE RULE rewrite_rule_name
ENABLE REPLICA RULE rewrite_rule_name
ENABLE ALWAYS RULE rewrite_rule_name
DISABLE ROW LEVEL SECURITY
ENABLE ROW LEVEL SECURITY
FORCE ROW LEVEL SECURITY
NO FORCE ROW LEVEL SECURITY
CLUSTER ON index_name
SET WITHOUT CLUSTER
SET WITHOUT OIDS
SET ACCESS METHOD { new_access_method | DEFAULT }
SET TABLESPACE new_tablespace
SET { LOGGED | UNLOGGED }
SET ( storage_parameter [= value] [, ... ] )
RESET ( storage_parameter [, ... ] )
INHERIT parent_table
NO INHERIT parent_table
OF type_name
NOT OF
OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING }

而partition_bound_spec为:

IN ( partition_bound_expr [, ...] ) |
FROM ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] )
TO ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] ) |
WITH ( MODULUS numeric_literal, REMAINDER numeric_literal )

而column_constraint为:

[ CONSTRAINT constraint_name ]
{ NOT NULL [ NO INHERIT ] |
NULL |
CHECK ( expression ) [ NO INHERIT ] |
DEFAULT default_expr |
GENERATED ALWAYS AS ( generation_expr ) [ STORED | VIRTUAL ] |
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] |
UNIQUE [ NULLS [ NOT ] DISTINCT ] index_parameters |
PRIMARY KEY index_parameters |
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
[ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ]

而table_constraint为:

[ CONSTRAINT constraint_name ]
{ CHECK ( expression ) [ NO INHERIT ] |
NOT NULL column_name [ NO INHERIT ] |
UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] [, column_name WITHOUT OVERLAPS ] ) index_parameters |
PRIMARY KEY ( column_name [, ... ] [, column_name WITHOUT OVERLAPS ] ) index_parameters |
EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] |
FOREIGN KEY ( column_name [, ... ] [, PERIOD column_name ] ) REFERENCES reftable [ ( refcolumn [, ... ] [, PERIOD refcolumn ] ) ]
[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ]

而table_constraint_using_index为:

[ CONSTRAINT constraint_name ]
{ UNIQUE | PRIMARY KEY } USING INDEX index_name
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

UNIQUE、PRIMARY KEY和EXCLUDE约束中的index_parameters为:

[ INCLUDE ( column_name [, ... ] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) ]
[ USING INDEX TABLESPACE tablespace_name ]

EXCLUDE约束中的exclude_element为:

{ column_name | ( expression ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]

FOREIGN KEY/REFERENCES约束中的referential_action为:

{ NO ACTION | RESTRICT | CASCADE | SET NULL [ ( column_name [, ... ] ) ] | SET DEFAULT [ ( column_name [, ... ] ) ] }

PostgreSQL 18 手册 · 查看完整参考页

描述

ALTER TABLE 更改现有表的定义。下面描述了若干子形式。请注意,各子形式所需的锁级别可能不同。除非另有明确说明,否则将获取 ACCESS EXCLUSIVE 锁。给出多个子命令时,获取的锁将是其中任一子命令所需的最严格级别。

ADD [ COLUMN ] [ IF NOT EXISTS ]

该形式使用与 CREATE TABLE 相同的语法向表中添加新列。如果指定了 IF NOT EXISTS,且同名列已经存在,则不会报错。

DROP [ COLUMN ] [ IF EXISTS ]

该形式从表中删除一列。涉及该列的索引和表约束也会自动删除。如果删除该列会使某个引用它的多元统计信息只剩下一列数据,那么该统计信息也会被移除。如果表外有任何对象依赖于该列,例如外键引用或视图,你就需要指定 CASCADE。如果指定了 IF EXISTS 而该列不存在,则不会报错;此时会发出一条提示。

SET DATA TYPE

该形式更改表中某一列的类型。涉及该列的索引和简单表约束会通过重新解析最初提供的表达式,自动转换为使用新的列类型。可选的 COLLATE 子句为新列指定排序规则;如果省略,则使用新列类型的默认排序规则。可选的 USING 子句指定如何根据旧值计算新列的值;如果省略,则默认转换与从旧数据类型到新数据类型的赋值类型转换相同。如果从旧类型到新类型不存在隐式或赋值类型转换,则必须提供 USING 子句。

当使用该形式时,列的统计信息会被删除,因此建议随后在该表上运行 ANALYZE。对于虚拟生成列,则不需要 ANALYZE,因为这类列从不具有统计信息。

SET/DROP DEFAULT

这些形式设置或移除列的默认值(其中移除等同于将默认值设为 NULL)。新的默认值只会应用于后续的 INSERT 或 UPDATE 命令;它不会导致表中已有的行发生变化。

SET/DROP NOT NULL

这些形式改变列是被标记为允许空值,还是被标记为拒绝空值。

SET NOT NULL 只能应用于满足以下条件的列:表中没有任何记录在该列上包含 NULL 值。通常,系统会在执行 ALTER TABLE 时通过扫描整个表来检查这一点,除非指定了 NOT VALID;不过,如果已存在一个有效的 CHECK 约束(并且不会在同一命令中被删除)能够证明不可能存在 NULL,则会跳过表扫描。如果一列带有一个无效的非空约束,SET NOT NULL 会对其进行验证。

如果该表是一个分区,而该列在父表中被标记为 NOT NULL,则不能对该列执行 DROP NOT NULL。要从所有分区中删除 NOT NULL 约束,请在父表上执行 DROP NOT NULL。即使父表上没有 NOT NULL 约束,也仍然可以根据需要在单独的分区上添加此类约束;也就是说,即使父表允许空值,子表仍可禁止空值,但反过来不行。也可以仅从父表中删除 NOT NULL 约束(即使用 ONLY),这样不会从子表中移除该约束。

SET EXPRESSION AS

该形式会替换生成列的表达式。存储生成列中的现有数据会被重写,此后的所有更改都会应用新的生成表达式。

当该形式用于存储生成列时,其统计信息会被删除,因此建议随后在该表上运行 ANALYZE。对于虚拟生成列,则不需要 ANALYZE,因为这类列从不具有统计信息。

DROP EXPRESSION [ IF EXISTS ]

该形式会把一个存储生成列转换成普通基础列。列中的现有数据会被保留,但今后的更改将不再应用生成表达式。

目前该形式只支持存储生成列(不支持虚拟生成列)。

如果指定了 DROP EXPRESSION IF EXISTS,而该列不是生成列,则不会报错;此时会发出一条提示。

ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY
SET GENERATED { ALWAYS | BY DEFAULT }
DROP IDENTITY [ IF EXISTS ]

这些形式改变列是否为标识列,或者更改现有标识列的生成属性。详情见 CREATE TABLE。与 SET DEFAULT 类似,这些形式只影响后续 INSERT 和 UPDATE 命令的行为;它们不会导致表中已有的行发生变化。

如果指定了 DROP IDENTITY IF EXISTS,而该列不是标识列,则不会报错;此时会发出一条提示。

SET sequence_option
RESTART

这些形式修改现有标识列底层的序列。sequence_option 是 ALTER SEQUENCE 支持的一个选项,例如 INCREMENT BY。

SET STATISTICS

该形式为后续 ANALYZE 操作设置列级统计信息收集目标。该目标可以设置在 0 到 10000 之间。将其设为 DEFAULT 可以恢复使用系统默认的统计目标(default_statistics_target)。(设为 -1 也是一种已废弃的写法,效果相同。)有关 PostgreSQL 查询规划器如何使用统计信息的更多信息,请参见第 14.2 节。

SET STATISTICS 会获取一个 SHARE UPDATE EXCLUSIVE 锁。

SET ( attribute_option = value [, ... ] )
RESET ( attribute_option [, ... ] )

该形式设置或重置每个属性的选项。目前定义的每属性选项只有 n_distinct 和 n_distinct_inherited,它们会覆盖后续 ANALYZE 操作对非重复值数量的估计。n_distinct 影响表本身的统计信息,而 n_distinct_inherited 影响为该表及其继承子表收集的统计信息,以及为分区表收集的统计信息。当指定值为正数时,查询规划器将假定该列恰好包含指定数量的非空非重复值。也可以通过使用小于 0 且大于等于 -1 的值来指定小数值。这会指示查询规划器通过将指定数字的绝对值乘以表中估计行数来估算非重复值的数量。例如,值为 -1 表示该列中的所有值都不同,而值为 -0.5 表示每个值平均出现两次。当表的大小随时间变化时,这会很有用。有关 PostgreSQL 查询规划器如何使用统计信息的更多信息,请参见第 14.2 节。

更改每个属性的选项会获取一个 SHARE UPDATE EXCLUSIVE 锁。

SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }

该形式设置列的存储模式。这控制该列的数据是行内保存还是保存在辅助 TOAST 表中,以及数据是否应被压缩。PLAIN 必须用于诸如 integer 之类的固定长度值,表示行内且不压缩。MAIN 用于行内、可压缩的数据。EXTERNAL 用于行外、不压缩的数据,而 EXTENDED 用于行外、已压缩的数据。写成 DEFAULT 会把存储模式设置为该列数据类型的默认模式。对于大多数支持非 PLAIN 存储的数据类型,默认模式是 EXTENDED。使用 EXTERNAL 会让对非常大的 text 和 bytea 值执行子串操作更快,但代价是占用更多存储空间。请注意,ALTER TABLE ... SET STORAGE 本身不会改变表中的任何内容;它只是设定未来更新表时要采用的策略。更多信息见第 66.2 节。

SET COMPRESSION compression_method

该形式设置列的压缩方法,用来决定未来插入的值将如何被压缩(前提是存储模式允许压缩)。这不会导致表被重写,因此现有数据仍可能采用其他压缩方法。如果使用 pg_restore 恢复该表,那么所有值都会按配置的压缩方法重新写入。然而,当数据是从另一个关系插入时(例如通过 INSERT ... SELECT),源表中的值不一定会被去 TOAST 化,因此先前已压缩的数据可能会保留原有的压缩方法,而不是按目标列的压缩方法重新压缩。支持的压缩方法有 pglz 和 lz4。(lz4 仅在使用 --with-lz4 构建 PostgreSQL 时才可用。)此外,compression_method 还可以是 default,表示在数据插入时查询 default_toast_compression 设置,以决定要使用的方法。

ADD table_constraint [ NOT VALID ]

该形式使用与 CREATE TABLE 相同的约束语法向表中添加一个新约束,另外还支持选项 NOT VALID;目前该选项只允许用于外键、CHECK 以及非空约束。

通常,该形式会扫描表,以验证表中所有现有行都满足新约束。但如果使用了 NOT VALID 选项,就会跳过这一步可能非常耗时的扫描。该约束仍会对后续的插入或更新生效(也就是说,对于外键,除非被引用表中存在匹配行,否则操作会失败;对于检查约束,除非新行满足指定的检查条件,否则操作会失败)。但是,在通过 VALIDATE CONSTRAINT 选项完成验证之前,数据库不会假定该约束对表中的所有行都成立。请参见下面的注解,了解使用 NOT VALID 选项的更多信息。

尽管大多数形式的 ADD table_constraint 需要 ACCESS EXCLUSIVE 锁,ADD FOREIGN KEY 只需要 SHARE ROW EXCLUSIVE 锁。请注意,ADD FOREIGN KEY 除了在声明约束的表上获取锁之外,还会在被引用的表上获取 SHARE ROW EXCLUSIVE 锁。

当向分区表添加唯一约束或主键约束时,还会受到附加限制;请参见 CREATE TABLE。

ADD table_constraint_using_index

该形式基于一个现有唯一索引向表中添加新的 PRIMARY KEY 或 UNIQUE 约束。该约束将包含该索引的全部列。

该索引不能包含表达式列,也不能是部分索引。此外,它必须是使用默认排序顺序的 B-树索引。这些限制保证该索引等价于通过常规 ADD PRIMARY KEY 或 ADD UNIQUE 命令构建出来的索引。

如果指定了 PRIMARY KEY,而该索引的列尚未被标记为 NOT NULL,则此命令会尝试对每个这样的列执行 ALTER COLUMN SET NOT NULL。这需要进行一次全表扫描,以验证这些列不包含空值。在其他情况下,这都是一个快速操作。

如果提供了约束名,则索引会被重命名以匹配该约束名;否则,约束将使用与索引相同的名称。

执行此命令后,该索引会被该约束“拥有”,就像它是通过常规 ADD PRIMARY KEY 或 ADD UNIQUE 命令构建出来的一样。特别是,删除该约束也会使该索引一并消失。

该形式目前不支持分区表。

注意

在需要添加新约束、但又不希望长时间阻塞表更新的场景中,使用现有索引添加约束会很有帮助。为此,可以先使用 CREATE UNIQUE INDEX CONCURRENTLY 创建索引,然后再用此语法把它转换成约束。参见下面的示例。

ALTER CONSTRAINT

该形式修改一个先前创建的约束的属性。目前只有外键约束可以用这种方式修改,但见下文。

ALTER CONSTRAINT ... INHERIT
ALTER CONSTRAINT ... NO INHERIT

这些形式会修改一个可继承约束,使其变为不可继承,或者反过来。当前只有非空约束可以这样修改。除了改变该约束的可继承状态之外,在把一个不可继承约束标记为可继承、且该表存在子表时,系统还会向这些子表添加一个等价约束。如果在存在子表的表上把一个可继承约束标记为不可继承,则子表上的对应约束会被标记为不再继承,但不会被移除。

VALIDATE CONSTRAINT

该形式通过扫描表来验证一个先前以 NOT VALID 创建的外键、检查或非空约束,以确保不存在任何不满足该约束的行。如果该约束被设置为 NOT ENFORCED,则会引发错误。如果该约束已经被标记为有效,则不会发生任何事情。(关于此命令有何用途,请参见下面的注解。)

此命令会获取一个 SHARE UPDATE EXCLUSIVE 锁。

DROP CONSTRAINT [ IF EXISTS ]

该形式删除表上指定的约束,以及支撑该约束的任何索引。如果指定了 IF EXISTS 而该约束不存在,则不会报错;此时会发出一条提示。

DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER

这些形式配置表上触发器的触发行为。被禁用的触发器仍为系统所知,但在其触发事件发生时不会执行。(对于延迟触发器,启用状态是在事件发生时检查,而不是在触发器函数实际执行时检查。)可以禁用或启用按名称指定的单个触发器、表上的全部触发器,或者仅用户触发器(此选项排除内部生成的约束触发器,例如用于实现外键约束或可延迟的唯一约束和排他约束的触发器)。禁用或启用内部生成的约束触发器需要超级用户权限;应谨慎执行,因为如果这些触发器不执行,就无法保证约束的完整性。

触发器的触发机制也受配置变量 session_replication_role 的影响。普通启用的触发器(默认)会在复制角色为“origin”(默认)或“local”时触发。配置为 ENABLE REPLICA 的触发器仅会在会话处于“replica”模式时触发,而配置为 ENABLE ALWAYS 的触发器无论当前复制角色为何都会触发。

这种机制的效果是,在默认配置下,触发器不会在副本上触发。这很有用,因为如果在源端使用触发器在表之间传播数据,那么复制系统也会复制这些传播后的数据;因此触发器不应在副本上再次触发,否则会导致重复。不过,如果触发器用于其他目的,例如生成外部告警,那么把它设置为 ENABLE ALWAYS、使其在副本上也触发,可能就是合适的做法。

当该命令应用于分区表时,分区中对应的克隆触发器的状态也会被更新,除非指定了 ONLY。

此命令会获取一个 SHARE ROW EXCLUSIVE 锁。

DISABLE/ENABLE [ REPLICA | ALWAYS ] RULE

这些形式配置属于表的重写规则是否应用。禁用的规则仍然为系统所知,但在查询重写期间不会应用。语义与禁用/启用触发器相同。对于 ON SELECT 规则,此配置将被忽略,这些规则始终会被应用,以确保视图在当前会话处于非默认复制角色时仍然正常工作。

规则触发机制也受配置变量 session_replication_role 的影响,类似于上面描述的触发器。

DISABLE/ENABLE ROW LEVEL SECURITY

这些形式控制属于该表的行安全性策略的应用。如果启用后该表没有任何策略,则会应用默认拒绝策略。请注意,即使行级安全已禁用,表上仍然可以存在策略。在这种情况下,这些策略不会被应用,而是会被忽略。另请参阅 CREATE POLICY。

NO FORCE/FORCE ROW LEVEL SECURITY

这些形式控制当用户是表所有者时,该表的行安全性策略是否生效。如果启用,则当用户是表所有者时也会应用行安全性策略;如果禁用(默认值),则当用户是表所有者时不会应用行级安全。另请参阅 CREATE POLICY。

CLUSTER ON

该形式选择未来 CLUSTER 操作的默认索引。它实际上并不会重新对表执行聚簇。

更改聚簇选项会获取一个 SHARE UPDATE EXCLUSIVE 锁。

SET WITHOUT CLUSTER

该形式从表中移除最近一次使用的 CLUSTER 所用索引设置。这会影响将来那些未指定索引的聚簇操作。

更改聚簇选项会获取一个 SHARE UPDATE EXCLUSIVE 锁。

SET WITHOUT OIDS

这是用于移除 oid 系统列的向后兼容语法。由于如今已无法再添加 oid 系统列,因此它实际上永远不会产生任何效果。

SET ACCESS METHOD

该形式通过使用指定的访问方法重写表来改变其访问方法;指定 DEFAULT 则会选择由配置参数 default_table_access_method 设定的访问方法。更多信息请参见第 62 章。

当应用于分区表时,没有数据需要重写,但之后创建的分区默认会使用给定的访问方法,除非被 USING 子句覆盖。指定 DEFAULT 会移除先前设置的值,使未来的分区重新默认使用 default_table_access_method。

SET TABLESPACE

该形式把表的表空间更改为指定的表空间,并将与该表关联的数据文件移动到新的表空间。表上的索引(如果有)不会被移动,但可以通过额外的 SET TABLESPACE 命令单独移动。当应用于分区表时,不会移动任何内容,但之后通过 CREATE TABLE PARTITION OF 创建的分区会使用该表空间,除非被 TABLESPACE 子句覆盖。

使用 ALL IN TABLESPACE 形式可以移动当前数据库中位于某个表空间中的所有表;该形式会先锁定所有待移动表,然后逐个移动。该形式还支持 OWNED BY,从而只移动指定角色拥有的表。如果指定了 NOWAIT,则一旦无法立即获取所需的全部锁,命令就会失败。请注意,系统目录不会通过此命令移动;如果需要,可改用 ALTER DATABASE 或显式的 ALTER TABLE 调用。information_schema 中的关系不被视为系统目录的一部分,因此会被移动。另请参阅 CREATE TABLESPACE。

SET { LOGGED | UNLOGGED }

该形式把表从不记录 WAL 改为记录 WAL,或反过来(参见 UNLOGGED)。它不能应用于临时表。

这也会改变与该表关联的任何序列(用于标识列或 serial 列)的持久性。不过,也可以单独更改这些序列的持久性。

该形式不支持分区表。

SET ( storage_parameter [= value] [, ... ] )

该形式更改表的一个或多个存储参数。可用参数的详细信息,请参见 CREATE TABLE 文档中的存储参数。请注意,此命令不会立即修改表内容;根据参数不同,你可能需要重写表才能获得预期效果。这可以通过 VACUUM FULL、CLUSTER,或者任何会强制重写表的 ALTER TABLE 形式来完成。对于与规划器相关的参数,更改会从下一次锁定该表时起生效,因此当前正在执行的查询不会受到影响。

对于 fillfactor、toast 和 autovacuum 存储参数,以及规划器参数 parallel_workers,会获取 SHARE UPDATE EXCLUSIVE 锁。

RESET ( storage_parameter [, ... ] )

该形式把一个或多个存储参数重置为默认值。与 SET 一样,可能仍需要进行表重写才能让整张表完全更新。

INHERIT parent_table

该形式把目标表添加为指定父表的新子表。此后,对父表的查询将包含目标表中的记录。要被添加为子表,目标表必须已经包含父表的所有同名列(也可以再有额外列)。这些列的数据类型必须匹配。

此外,父表上的所有 CHECK 和 NOT NULL 约束也都必须存在于子表上,但被标记为不可继承的约束(即使用 ALTER TABLE ... ADD CONSTRAINT ... NO INHERIT 创建的约束)除外,这些约束会被忽略。所有与之匹配的子表约束都不能被标记为不可继承。目前不会考虑 UNIQUE、PRIMARY KEY 和 FOREIGN KEY 约束,但将来这可能会改变。

NO INHERIT parent_table

该形式把目标表从指定父表的子表列表中移除。对父表的查询将不再包含来自目标表的记录。

OF type_name

该形式把表关联到一个复合类型,就好像它是通过 CREATE TABLE OF 创建的一样。表的列名和类型列表必须与该复合类型完全一致。该表还必须不继承自任何其他表。这些限制保证了 CREATE TABLE OF 会允许一个等价的表定义。

NOT OF

该形式会解除类型化表与其类型之间的关联。

OWNER TO

该形式把表、序列、视图、物化视图或外部表的所有者更改为指定用户。

REPLICA IDENTITY

该形式修改写入预写式日志的信息,以标识被更新或删除的行。在大多数情况下,只有当某列的旧值与新值不同,才记录该列的旧值;不过,如果旧值是外部存储的,则无论它是否改变,都会被记录。除非正在使用逻辑复制,否则该选项没有效果。

DEFAULT

记录主键列的旧值。这是非系统表的默认值。如果没有主键,其行为与 NOTHING 相同。

USING INDEX index_name

记录由指定索引覆盖的列的旧值。该索引必须是唯一的、非部分的、不可延迟的,并且只包含被标记为 NOT NULL 的列。如果该索引被删除,其行为与 NOTHING 相同。

FULL

记录该行中所有列的旧值。

NOTHING

不记录关于旧行的任何信息。这是系统表的默认值。

RENAME

RENAME 形式用于更改表(或索引、序列、视图、物化视图或外部表)的名称、表中某个列的名称,或者表上某个约束的名称。重命名一个带有底层索引的约束时,该索引也会一并重命名。已存储的数据不会受到影响。

SET SCHEMA

该形式把表移动到另一个模式。相关索引、约束以及由表列拥有的序列也会一并移动。

ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | DEFAULT }

该形式把一个现有表(它本身也可能已分区)附加为目标表的一个分区。可以使用 FOR VALUES 把它附加为特定值的分区,也可以使用 DEFAULT 把它附加为默认分区。对于目标表中的每个索引,如果分区中已经存在有效的等价索引,则会把它附加到目标表的索引上,就像执行了 ALTER INDEX ATTACH PARTITION 一样;否则,将创建一个新的对应索引。分区上的无效索引会被跳过。请注意,如果现有表是外部表,而目标表上存在 UNIQUE 索引,则当前不允许把该表附加为目标表的分区。(另见 CREATE FOREIGN TABLE。)对于目标表中存在的每个用户定义行级触发器,也都会在被附加表中创建一个对应触发器。

使用 FOR VALUES 的分区,其 partition_bound_spec 语法与 CREATE TABLE 中的相同。分区边界说明必须与目标表的分区策略和分区键相对应。待附加的表必须拥有与目标表完全相同且不多不少的列;此外,列类型也必须匹配。它还必须具有目标表上所有未标记为 NO INHERIT 的 NOT NULL 和 CHECK 约束。目前不会考虑 FOREIGN KEY 约束。如果父表中的 UNIQUE 和 PRIMARY KEY 约束尚不存在于该分区中,则会在该分区上创建这些约束。

如果新分区是普通表,则会执行一次全表扫描,以检查表中现有行不会违反分区约束。可以在执行此命令之前,先向该表添加一个有效的 CHECK 约束,使其只允许满足所需分区约束的行,从而避免这次扫描。系统会利用该 CHECK 约束来判断无须扫描该表以验证分区约束。不过,如果分区键中有任何一个是表达式,而该分区又不接受 NULL 值,则这一方法无效。如果附加的是一个不接受 NULL 值的列表分区,还应向分区键列添加 NOT NULL 约束,除非该分区键是表达式。

如果新分区是外部表,则不会执行任何检查来验证该外部表中的所有行都满足分区约束。(关于外部表上的约束,请参见 CREATE FOREIGN TABLE 中的讨论。)

当某个表具有默认分区时,定义一个新分区会改变默认分区的分区约束。默认分区不能包含任何本应移动到新分区中的行,因此系统会扫描默认分区以确认不存在此类行。和扫描新分区一样,如果存在适当的 CHECK 约束,也可以避免这次扫描;同样地,当默认分区是外部表时,这次扫描总会被跳过。

附加分区会在父表上获取一个 SHARE UPDATE EXCLUSIVE 锁,此外还会在被附加的表以及默认分区(如果有)上获取 ACCESS EXCLUSIVE 锁。

如果被附加的表本身是分区表,则还必须在其所有子分区上持有锁;如果默认分区本身也是分区表,也是如此。添加 CHECK 约束(如第 5.12.2.2 节所述)可以避免对子分区加锁。

DETACH PARTITION partition_name [ CONCURRENTLY | FINALIZE ]

该形式会把目标表的指定分区分离出来。被分离的分区会继续作为一张独立表存在,但不再与原先所在的表保持任何关联。任何附加到目标表索引上的索引都会被分离。任何作为目标表中触发器克隆而创建的触发器都会被移除。对于任何在外键约束中引用该父分区表的表,都会获取 SHARE 锁。

如果指定了 CONCURRENTLY,它将使用较低的锁级别运行,以避免阻塞其他可能正在访问该分区表的会话。在这种模式下,内部会使用两个事务。第一个事务中,会在父表和该分区上都获取 SHARE UPDATE EXCLUSIVE 锁,并把该分区标记为正在分离;随后提交事务,并等待所有其他正在使用该分区表的事务结束。在所有这些事务完成后,第二个事务会在分区表上获取 SHARE UPDATE EXCLUSIVE 锁、在分区上获取 ACCESS EXCLUSIVE 锁,并完成分离过程。系统还会向该分区添加一个与分区约束等价的 CHECK 约束。CONCURRENTLY 不能在事务块中运行;如果该分区表包含默认分区,也不允许使用它。

如果指定了 FINALIZE,则会完成此前被取消或中断的 DETACH CONCURRENTLY 调用。在任意时刻,一个分区表中最多只能有一个分区处于等待分离完成的状态。

所有作用于单个表的 ALTER TABLE 形式,除 RENAME、SET SCHEMA、ATTACH PARTITION 和 DETACH PARTITION 外,都可以组合成一个多项修改列表,一并执行。例如,可以在一条命令中添加多个列并且/或者修改多个列的类型。对于大型表,这一点尤其有用,因为这样只需对表执行一次遍历。

要使用 ALTER TABLE,你必须拥有该表。要更改表的模式或表空间,你还必须在新模式或新表空间上拥有 CREATE 权限。要把一个表作为父表的新子表加入,你还必须拥有该父表。此外,要把一个表附加为另一个表的新分区,你必须拥有被附加的表。要更改所有者,你必须能够对新的所有者角色执行 SET ROLE,并且该角色必须在该表所在模式上具有 CREATE 权限。(这些限制确保更改所有者不会做出任何你不能通过删除并重建该表来完成的事情。不过,超级用户无论如何都可以更改任何表的所有权。)要添加列、修改列类型或使用 OF 子句,你还必须在相应数据类型上具有 USAGE 权限。

参数

IF EXISTS

如果表不存在,则不要抛出错误。这种情况下会发出一条提示。

name

要修改的一个现有表的名称(可以是模式限定的)。如果在表名前指定了 ONLY,则只会修改该表。如果没有指定 ONLY,该表及其所有后代表(如果有)都会被修改。可选地,在表名后面可以指定 * 用来显式地指示包括后代表。

column_name

新列或现有列的名称。

new_column_name

现有列的新名称。

new_name

表的新名称。

data_type

新列的数据类型,或现有列的新数据类型。

table_constraint

该表的新的表约束。

constraint_name

一个新约束或者现有约束的名称。

CASCADE

自动删除依赖于被删除列或约束的对象(例如引用该列的视图),以及所有进一步依赖于这些对象的对象(见第 5.15 节)。

RESTRICT

如果存在任何依赖对象,则拒绝删除该列或约束。这是默认行为。

trigger_name

要禁用或启用的单个触发器的名称。

ALL

禁用或启用属于表的所有触发器。(如果任何触发器是内部生成的约束触发器,例如用于实现外键约束或可延迟唯一约束和排他约束的触发器,则需要超级用户权限。)

USER

禁用或启用属于表的所有触发器,但不包括内部生成的约束触发器(例如用于实现外键约束或可延迟的唯一约束和排他约束的触发器)。

index_name

一个现有索引的名称。

storage_parameter

一个表存储参数的名称。

value

一个表存储参数的新值。根据该参数,该值可能是一个数字或者一个词。

parent_table

要与这个表关联或者解除关联的父表。

new_owner

该表的新拥有者的用户名。

new_access_method

要将表转换到的访问方法名称。

new_tablespace

要把该表移入其中的表空间的名称。

new_schema

该表将被移动到的模式名称。

partition_name

要附加为该表的新分区或从该表分离出去的表名。

partition_bound_spec

新分区的分区边界说明。关于该语法的更多细节,请参见 CREATE TABLE。

注解

关键字 COLUMN 不影响语义,可以省略。

当使用 ADD COLUMN 添加一列并指定了一个非易失性 DEFAULT 时,默认值会在该语句执行时计算,其结果会保存在表的元数据中;访问任何现有行时都会返回该值。只有在表被重写时,这个值才会真正应用到行中,因此即使面对大表,ALTER TABLE 也会非常快。如果没有指定列约束,则会使用 NULL 作为 DEFAULT。在这两种情况下都不需要重写表。

添加带有易失性 DEFAULT(例如 clock_timestamp())的列、存储生成列、标识列,或者数据类型为带约束域的列,都会导致整个表及其索引被重写。添加虚拟生成列则永远不需要重写。

更改现有列的类型通常会导致整个表及其索引被重写。作为例外,如果更改现有列的类型时,USING 子句并未改变列内容,且旧类型要么可以二进制强制转换为新类型,要么是基于新类型的无约束域,则不需要重写表。不过,除非系统能够验证新索引在逻辑上与现有索引等价,否则索引仍会被重建。例如,如果更改了列的排序规则,就必须重建索引,因为新的排序顺序可能不同。然而,在没有改变排序规则的情况下,可以在不重建索引的前提下将列从 text 改为 varchar(反之亦然),因为这两种数据类型的排序方式相同。

对于大表,表和/或索引重建可能会耗费大量时间,并且临时需要多达两倍的磁盘空间。

添加 CHECK 或 NOT NULL 约束需要扫描表,以验证现有行满足该约束,但不需要重写表。如果把 CHECK 约束添加为 NOT ENFORCED,则不会执行此验证。

类似地,在附加新分区时,也可能会扫描该分区以验证现有行满足分区约束。

在单个 ALTER TABLE 中允许指定多个更改的主要原因,是可以把多次表扫描或重写合并为对表的一次遍历。

扫描大表以验证新的外键、检查或非空约束可能需要很长时间,并且在 ALTER TABLE ADD CONSTRAINT 命令提交之前,会阻止对该表的其他更新。NOT VALID 约束选项的主要目的,是减小添加约束对并发更新的影响。使用 NOT VALID 时,ADD CONSTRAINT 命令不会扫描表,因此可以立即提交。之后可以发出 VALIDATE CONSTRAINT 命令,以验证现有行满足该约束。验证步骤不需要阻止并发更新,因为它知道其他事务会对它们插入或更新的行强制执行该约束;只需检查预先存在的行。因此,验证只会在被修改的表上获取 SHARE UPDATE EXCLUSIVE 锁。(如果约束是外键,则被该约束引用的表上还需要 ROW SHARE 锁。)除了改善并发性之外,在已知该表包含既有违规数据的情况下,NOT VALID 和 VALIDATE CONSTRAINT 也很有用。一旦约束已经建立,就不能再插入新的违规数据,而现有问题则可以从容修正,直到 VALIDATE CONSTRAINT 最终成功。

DROP COLUMN 形式不会在物理上移除该列,而只是让它对 SQL 操作不可见。此后,对该表的插入和更新操作会为该列存储一个空值。因此,删除一列虽然很快,但不会立刻减少表占用的磁盘空间,因为被删除列所占用的空间尚未被回收。随着现有行被更新,这些空间会逐渐被回收。

若要强制立即回收已删除列所占的空间,可以执行任何一种会导致整表重写的 ALTER TABLE 形式。这样会重建每一行,并用空值替换被删除的列。

会重写表的 ALTER TABLE 形式对于 MVCC 来说并不安全。表重写完成后,如果并发事务使用的是在重写发生之前取得的快照,那么该表在这些并发事务看来会像一张空表。详见第 13.6 节。

SET DATA TYPE 的 USING 选项实际上可以指定任何涉及该行旧值的表达式;也就是说,它既可以引用正在转换的列,也可以引用其他列。这使得使用 SET DATA TYPE 语法完成非常通用的转换成为可能。正因为这种灵活性,USING 表达式不会应用到列的默认值(如果有)上,因为其结果可能不是默认值所要求的常量表达式。这意味着,当从旧类型到新类型不存在隐式或赋值类型转换时,即便提供了 USING 子句,SET DATA TYPE 也可能仍然无法转换默认值。在这种情况下,可以先用 DROP DEFAULT 删除默认值,执行 ALTER TYPE,然后再用 SET DEFAULT 添加一个合适的新默认值。类似的考虑也适用于涉及该列的索引和约束。

如果某个表有任何后代表,那么在不对后代表执行相同操作的情况下,就不允许在父表中添加列、重命名列或更改列类型。这保证了后代表始终拥有与父表相匹配的列。类似地,如果不同时重命名所有后代上的 CHECK 约束,就不能只在父表上重命名该检查约束,这样 CHECK 约束才能在父表及其后代之间保持匹配。(不过,这一限制不适用于基于索引的约束。)此外,由于查询父表时也会同时查询其后代,父表上的约束除非在这些后代上也被标记为有效,否则就不能被标记为有效。在所有这些情况下,ALTER TABLE ONLY 都会被拒绝。

只有当某个后代表中的列既不是从其他父表继承而来,也从未有过该列的独立定义时,递归的 DROP COLUMN 操作才会移除该后代表中的此列。非递归的 DROP COLUMN(即 ALTER TABLE ONLY ... DROP COLUMN)永远不会移除任何后代列,而只会把它们标记为独立定义,而非继承得到。对于分区表,非递归的 DROP COLUMN 命令会失败,因为一张表的所有分区都必须与分区根表拥有相同的列。

对于标识列的操作(ADD GENERATED、SET 等、DROP IDENTITY),以及 CLUSTER、OWNER 和 TABLESPACE 等操作,永远不会递归到后代表;也就是说,它们总是像指定了 ONLY 一样执行。影响触发器状态的操作会递归到分区表的各个分区(除非指定了 ONLY),但永远不会递归到传统继承体系中的后代表。添加约束时,只有未标记为 NO INHERIT 的 CHECK 约束才会递归下去。

不允许更改系统目录表的任何部分。

有关有效参数的进一步说明,请参见 CREATE TABLE。第 5 章中还有关于继承的更多信息。

示例

要向表中添加一个 varchar 类型的列:

ALTER TABLE distributors ADD COLUMN address varchar(30);

这会使表中所有现有行的新列都填入空值。

要添加一个带非空默认值的列:

ALTER TABLE measurements
  ADD COLUMN mtime timestamp with time zone DEFAULT now();

现有行会以当前时间作为新列的值填充,之后新行会接收其插入时的时间。

要添加一列,并先用与之后默认值不同的值填充它:

ALTER TABLE transactions
  ADD COLUMN status varchar(30) DEFAULT 'old',
  ALTER COLUMN status SET default 'current';

现有行会填入 old,而后续命令的默认值将是 current。其效果与在两条单独的 ALTER TABLE 命令中发出这两个子命令相同。

要从表中删除一列:

ALTER TABLE distributors DROP COLUMN address RESTRICT;

要在一个操作中更改两个现有列的类型:

ALTER TABLE distributors
    ALTER COLUMN address TYPE varchar(80),
    ALTER COLUMN name TYPE varchar(100);

要把一个包含 Unix 时间戳的整数列改为 timestamp with time zone,并通过 USING 子句完成转换:

ALTER TABLE foo
    ALTER COLUMN foo_timestamp SET DATA TYPE timestamp with time zone
    USING
        timestamp with time zone 'epoch' + foo_timestamp * interval '1 second';

如果该列带有一个不能自动转换为新数据类型的默认值表达式,也是同样的做法:

ALTER TABLE foo
    ALTER COLUMN foo_timestamp DROP DEFAULT,
    ALTER COLUMN foo_timestamp TYPE timestamp with time zone
    USING
        timestamp with time zone 'epoch' + foo_timestamp * interval '1 second',
    ALTER COLUMN foo_timestamp SET DEFAULT now();

要重命名一个现有列:

ALTER TABLE distributors RENAME COLUMN address TO city;

重命名一个现有的表:

ALTER TABLE distributors RENAME TO suppliers;

重命名一个现有的约束:

ALTER TABLE distributors RENAME CONSTRAINT zipchk TO zip_check;

为一列增加一个非空约束:

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 ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NO INHERIT;

(该检查约束也不会被未来的后代表继承。)

要从一个表及其所有后代移除一个检查约束:

ALTER TABLE distributors DROP CONSTRAINT zipchk;

只从一个表移除一个检查约束:

ALTER TABLE ONLY distributors DROP CONSTRAINT zipchk;

(该检查约束在所有子表上仍然保留。)

为一个表增加一个外键约束:

ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address);

为一个表增加一个外键约束,并且尽量不要影响其他工作:

ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address) NOT VALID;
ALTER TABLE distributors VALIDATE CONSTRAINT distfk;

为一个表增加一个(多列)唯一约束:

ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);

为一个表增加一个自动命名的主键约束,注意一个表只能拥有一个主键:

ALTER TABLE distributors ADD PRIMARY KEY (dist_id);

把一个表移动到一个不同的表空间:

ALTER TABLE distributors SET TABLESPACE fasttablespace;

把一个表移动到一个不同的模式:

ALTER TABLE myschema.distributors SET SCHEMA yourschema;

重建一个主键约束,并且在重建索引期间不阻塞更新:

CREATE UNIQUE INDEX CONCURRENTLY dist_id_temp_idx ON distributors (dist_id);
ALTER TABLE distributors DROP CONSTRAINT distributors_pkey,
    ADD CONSTRAINT distributors_pkey PRIMARY KEY USING INDEX dist_id_temp_idx;

要把一个分区附加到范围分区表上:

ALTER TABLE measurement
    ATTACH PARTITION measurement_y2016m07 FOR VALUES FROM ('2016-07-01') TO ('2016-08-01');

要把一个分区附加到列表分区表上:

ALTER TABLE cities
    ATTACH PARTITION cities_ab FOR VALUES IN ('a', 'b');

要把一个分区附加到 hash 分区表上:

ALTER TABLE orders
    ATTACH PARTITION orders_p4 FOR VALUES WITH (MODULUS 4, REMAINDER 3);

要把默认分区附加到分区表上:

ALTER TABLE cities
    ATTACH PARTITION cities_partdef DEFAULT;

从一个分区表分离一个分区:

ALTER TABLE measurement
    DETACH PARTITION measurement_y2015m12;

兼容性

形式 ADD [COLUMN]、DROP [COLUMN]、DROP IDENTITY、RESTART、SET DEFAULT、SET DATA TYPE(不带 USING)、SET GENERATED 以及 SET sequence_option 符合 SQL 标准。形式 ADD table_constraint 在省略 USING INDEX 和 NOT VALID 子句,且约束类型为 CHECK、UNIQUE、PRIMARY KEY 或 REFERENCES 之一时,也符合 SQL 标准。其他形式都是 PostgreSQL 对 SQL 标准的扩展。此外,在单个 ALTER TABLE 命令中指定多个修改也是一种扩展。

ALTER TABLE DROP COLUMN 可以被用来删除一个表的唯一的列,从而留下一个零列的表。这是一种 SQL 的扩展,SQL 中不允许零列的表。

另见

语法演化

相邻大版本之间的差异,新的在前。版本号链接到对应快照。

  1. PostgreSQL 19← 18正文更新

    正文更新
  2. PostgreSQL 18← 17语法变化

    + ALTER CONSTRAINT constraint_name [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ]+ ALTER CONSTRAINT constraint_name [ INHERIT | NO INHERIT ]+ { NOT NULL [ NO INHERIT ] |+ GENERATED ALWAYS AS ( generation_expr ) [ STORED | VIRTUAL ] |+ [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ]+ [ CONSTRAINT constraint_name ]+ { CHECK ( expression ) [ NO INHERIT ] |+ NOT NULL column_name [ NO INHERIT ] |+ UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] [, column_name WITHOUT OVERLAPS ] ) index_parameters |+ PRIMARY KEY ( column_name [, ... ] [, column_name WITHOUT OVERLAPS ] ) index_parameters |+ FOREIGN KEY ( column_name [, ... ] [, PERIOD column_name ] ) REFERENCES reftable [ ( refcolumn [, ... ] [, PERIOD refcolumn ] ) ]+ [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ ENFORCED | NOT ENFORCED ]正文更新
  3. PostgreSQL 17← 16语法变化

    + ALTER [ COLUMN ] column_name SET EXPRESSION AS ( expression )+ ALTER [ COLUMN ] column_name DROP EXPRESSION [ IF EXISTS ]+ ALTER [ COLUMN ] column_name SET STATISTICS { integer | DEFAULT }+ SET ACCESS METHOD { new_access_method | DEFAULT }正文更新
  4. PostgreSQL 16← 15语法变化

    + ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }正文更新
  5. PostgreSQL 15← 14语法变化

    + SET ACCESS METHOD new_access_method+ SET TABLESPACE new_tablespace+ UNIQUE [ NULLS [ NOT ] DISTINCT ] index_parameters |+ UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] ) index_parameters |+ { NO ACTION | RESTRICT | CASCADE | SET NULL [ ( column_name [, ... ] ) ] | SET DEFAULT [ ( column_name [, ... ] ) ] }正文更新
  6. PostgreSQL 14← 13语法变化

    + DETACH PARTITION partition_name [ CONCURRENTLY | FINALIZE ]+ ALTER [ COLUMN ] column_name SET COMPRESSION compression_method+ OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }正文更新
  7. PostgreSQL 13← 12语法变化

    + ALTER [ COLUMN ] column_name DROP EXPRESSION [ IF EXISTS ]+ { column_name | ( expression ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]正文更新
  8. PostgreSQL 12← 11语法变化

    + IN ( partition_bound_expr [, ...] ) |+ FROM ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] )+ TO ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] ) |+ GENERATED ALWAYS AS ( generation_expr ) STORED |+ GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] |+ [ ON DELETE referential_action ] [ ON UPDATE referential_action ] }+ [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] }− SET WITH OIDS− SET WITHOUT OIDS− IN ( { numeric_literal | string_literal | TRUE | FALSE | NULL } [, ...] ) |− FROM ( { numeric_literal | string_literal | TRUE | FALSE | MINVALUE | MAXVALUE } [, ...] )− TO ( { numeric_literal | string_literal | TRUE | FALSE | MINVALUE | MAXVALUE } [, ...] ) |− [ ON DELETE action ] [ ON UPDATE action ] }− [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] }正文更新
  9. PostgreSQL 11← 10语法变化

    + ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | DEFAULT }+ IN ( { numeric_literal | string_literal | TRUE | FALSE | NULL } [, ...] ) |+ FROM ( { numeric_literal | string_literal | TRUE | FALSE | MINVALUE | MAXVALUE } [, ...] )+ TO ( { numeric_literal | string_literal | TRUE | FALSE | MINVALUE | MAXVALUE } [, ...] ) |+ WITH ( MODULUS numeric_literal, REMAINDER numeric_literal )+ [ CONSTRAINT constraint_name ]+ { NOT NULL |+ NULL |+ CHECK ( expression ) [ NO INHERIT ] |+ DEFAULT default_expr |+ GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] |+ UNIQUE index_parameters |+ PRIMARY KEY index_parameters |+ REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]+ [ ON DELETE action ] [ ON UPDATE action ] }+ [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]+ [ CONSTRAINT constraint_name ]+ { CHECK ( expression ) [ NO INHERIT ] |+ UNIQUE ( column_name [, ... ] ) index_parameters |+ PRIMARY KEY ( column_name [, ... ] ) index_parameters |+ EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] |+ FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]+ [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] }+ [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]+ [ INCLUDE ( column_name [, ... ] ) ]+ [ WITH ( storage_parameter [= value] [, ... ] ) ]+ [ USING INDEX TABLESPACE tablespace_name ]+ { column_name | ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]正文更新
  10. PostgreSQL 10← 9.6语法变化

    + ALTER TABLE [ IF EXISTS ] name+ ATTACH PARTITION partition_name FOR VALUES partition_bound_spec+ ALTER TABLE [ IF EXISTS ] name+ DETACH PARTITION partition_name+ ALTER [ COLUMN ] column_name ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ]+ ALTER [ COLUMN ] column_name { SET GENERATED { ALWAYS | BY DEFAULT } | SET sequence_option | RESTART [ [ WITH ] restart ] } [...]+ ALTER [ COLUMN ] column_name DROP IDENTITY [ IF EXISTS ]正文更新
  11. PostgreSQL 9.6← 9.5语法变化

    + ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]正文更新
  12. PostgreSQL 9.5← 9.4语法变化

    + DISABLE ROW LEVEL SECURITY+ ENABLE ROW LEVEL SECURITY+ FORCE ROW LEVEL SECURITY+ NO FORCE ROW LEVEL SECURITY+ SET TABLESPACE new_tablespace+ SET { LOGGED | UNLOGGED }+ SET ( storage_parameter [= value] [, ... ] )+ OWNER TO { new_owner | CURRENT_USER | SESSION_USER }− SET TABLESPACE new_tablespace正文更新
  13. PostgreSQL 9.4← 9.3语法变化

    + ALTER TABLE ALL IN TABLESPACE name [ OWNED BY role_name [, ... ] ]+ SET TABLESPACE new_tablespace [ NOWAIT ]+ ALTER CONSTRAINT constraint_name [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]+ REPLICA IDENTITY {DEFAULT | USING INDEX index_name | FULL | NOTHING}正文更新
  14. PostgreSQL 9.3← 9.2正文更新

    正文更新
  15. PostgreSQL 9.2← 9.1语法变化

    + ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]+ ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]+ RENAME [ COLUMN ] column_name TO new_column_name+ ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]+ RENAME CONSTRAINT constraint_name TO new_constraint_name+ ALTER TABLE [ IF EXISTS ] name+ ALTER TABLE [ IF EXISTS ] name+ ADD [ COLUMN ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]+ DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]+ ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]+ ALTER [ COLUMN ] column_name SET DEFAULT expression+ ALTER [ COLUMN ] column_name DROP DEFAULT+ ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL+ ALTER [ COLUMN ] column_name SET STATISTICS integer+ ALTER [ COLUMN ] column_name SET ( attribute_option = value [, ... ] )+ ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] )+ ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }− RENAME [ COLUMN ] column TO new_column− ADD [ COLUMN ] column data_type [ COLLATE collation ] [ column_constraint [ ... ] ]− DROP [ COLUMN ] [ IF EXISTS ] column [ RESTRICT | CASCADE ]− ALTER [ COLUMN ] column [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]− ALTER [ COLUMN ] column SET DEFAULT expression− ALTER [ COLUMN ] column DROP DEFAULT− ALTER [ COLUMN ] column { SET | DROP } NOT NULL− ALTER [ COLUMN ] column SET STATISTICS integer− ALTER [ COLUMN ] column SET ( attribute_option = value [, ... ] )− ALTER [ COLUMN ] column RESET ( attribute_option [, ... ] )− ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }正文更新
  16. PostgreSQL 9.1← 9.0语法变化

    + ADD [ COLUMN ] column data_type [ COLLATE collation ] [ column_constraint [ ... ] ]+ ALTER [ COLUMN ] column [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]+ ADD table_constraint [ NOT VALID ]+ ADD table_constraint_using_index+ VALIDATE CONSTRAINT constraint_name+ OF type_name+ NOT OF+ [ CONSTRAINT constraint_name ]+ { UNIQUE | PRIMARY KEY } USING INDEX index_name+ [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]− ADD [ COLUMN ] column type [ column_constraint [ ... ] ]− ALTER [ COLUMN ] column [ SET DATA ] TYPE type [ USING expression ]正文更新
  17. PostgreSQL 9.0← 8.4语法变化

    + DROP [ COLUMN ] [ IF EXISTS ] column [ RESTRICT | CASCADE ]+ ALTER [ COLUMN ] column SET ( attribute_option = value [, ... ] )+ ALTER [ COLUMN ] column RESET ( attribute_option [, ... ] )+ ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }+ DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ]− where action is one of:正文更新
  18. PostgreSQL 8.4← 8.3语法变化

    + ALTER [ COLUMN ] column [ SET DATA ] TYPE type [ USING expression ]+ SET WITH OIDS+ SET WITHOUT OIDS正文更新
  19. PostgreSQL 8.3← 8.2语法变化

    + ENABLE REPLICA TRIGGER trigger_name+ ENABLE ALWAYS TRIGGER trigger_name+ DISABLE RULE rewrite_rule_name+ ENABLE RULE rewrite_rule_name+ ENABLE REPLICA RULE rewrite_rule_name+ ENABLE ALWAYS RULE rewrite_rule_name正文更新
  20. PostgreSQL 8.2← 8.1语法变化

    + SET ( storage_parameter = value [, ... ] )+ RESET ( storage_parameter [, ... ] )+ INHERIT parent_table+ NO INHERIT parent_table正文更新
  21. PostgreSQL 8.1← 8.0语法变化

    + ALTER TABLE name+ SET SCHEMA new_schema+ DISABLE TRIGGER [ trigger_name | ALL | USER ]+ ENABLE TRIGGER [ trigger_name | ALL | USER ]+ SET TABLESPACE new_tablespace− SET TABLESPACE tablespace_name正文更新
  22. PostgreSQL 8.0← 7.4语法变化

    + action [, ... ]+ where action is one of:+ ADD [ COLUMN ] column type [ column_constraint [ ... ] ]+ DROP [ COLUMN ] column [ RESTRICT | CASCADE ]+ ALTER [ COLUMN ] column TYPE type [ USING expression ]+ ALTER [ COLUMN ] column SET DEFAULT expression+ ALTER [ COLUMN ] column DROP DEFAULT+ ALTER [ COLUMN ] column { SET | DROP } NOT NULL+ ALTER [ COLUMN ] column SET STATISTICS integer+ ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }+ CLUSTER ON index_name+ SET WITHOUT CLUSTER+ SET WITHOUT OIDS+ SET TABLESPACE tablespace_name− ADD [ COLUMN ] column type [ column_constraint [ ... ] ]− ALTER TABLE [ ONLY ] name [ * ]− DROP [ COLUMN ] column [ RESTRICT | CASCADE ]− ALTER TABLE [ ONLY ] name [ * ]− ALTER [ COLUMN ] column { SET DEFAULT expression | DROP DEFAULT }− ALTER TABLE [ ONLY ] name [ * ]− ALTER [ COLUMN ] column { SET | DROP } NOT NULL− ALTER TABLE [ ONLY ] name [ * ]− ALTER [ COLUMN ] column SET STATISTICS integer− ALTER TABLE [ ONLY ] name [ * ]− ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }− ALTER TABLE [ ONLY ] name [ * ]− SET WITHOUT OIDS− ALTER TABLE [ ONLY ] name [ * ]− ALTER TABLE [ ONLY ] name [ * ]− ALTER TABLE name− ALTER TABLE name− CLUSTER ON index_name正文更新
  23. PostgreSQL 7.4← 7.3语法变化

    + ALTER TABLE [ ONLY ] name [ * ]+ ALTER TABLE [ ONLY ] name [ * ]+ ALTER TABLE [ ONLY ] name [ * ]+ ALTER [ COLUMN ] column { SET DEFAULT expression | DROP DEFAULT }+ ALTER TABLE [ ONLY ] name [ * ]+ ALTER TABLE [ ONLY ] name [ * ]+ ALTER TABLE [ ONLY ] name [ * ]+ ALTER TABLE [ ONLY ] name [ * ]+ SET WITHOUT OIDS+ ALTER TABLE [ ONLY ] name [ * ]+ ALTER TABLE name+ RENAME TO new_name+ ALTER TABLE [ ONLY ] name [ * ]+ ALTER TABLE [ ONLY ] name [ * ]+ ALTER TABLE name+ ALTER TABLE name+ CLUSTER ON index_name− ALTER TABLE [ ONLY ] table [ * ]− ALTER TABLE [ ONLY ] table [ * ]− ALTER TABLE [ ONLY ] table [ * ]− ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT }− ALTER TABLE [ ONLY ] table [ * ]− ALTER TABLE [ ONLY ] table [ * ]− ALTER TABLE [ ONLY ] table [ * ]− ALTER TABLE [ ONLY ] table [ * ]− ALTER TABLE table− RENAME TO new_table− ALTER TABLE [ ONLY ] table [ * ]− ALTER TABLE [ ONLY ] table [ * ]− ALTER TABLE table正文更新
  24. PostgreSQL 7.3← 7.2语法变化

    + ADD [ COLUMN ] column type [ column_constraint [ ... ] ]+ ALTER TABLE [ ONLY ] table [ * ]+ DROP [ COLUMN ] column [ RESTRICT | CASCADE ]+ ALTER [ COLUMN ] column { SET | DROP } NOT NULL+ ALTER TABLE [ ONLY ] table [ * ]+ ALTER [ COLUMN ] column SET STATISTICS integer+ ALTER TABLE [ ONLY ] table [ * ]+ ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }+ RENAME [ COLUMN ] column TO new_column+ ALTER TABLE [ ONLY ] table [ * ]+ ADD table_constraint+ ALTER TABLE [ ONLY ] table [ * ]+ DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]− RENAME [ COLUMN ] column TO newcolumn− ADD table_constraint_definition− DROP CONSTRAINT constraint { RESTRICT | CASCADE }正文更新
  25. PostgreSQL 7.2← 7.1语法变化

    + ADD [ COLUMN ] column type [ column_constraint [ ... ] ]+ ALTER TABLE [ ONLY ] table [ * ]+ ALTER [ COLUMN ] column SET STATISTICS integer+ ALTER TABLE [ ONLY ] table [ * ]+ RENAME TO new_table+ ADD table_constraint_definition+ ALTER TABLE [ ONLY ] table+ DROP CONSTRAINT constraint { RESTRICT | CASCADE }+ OWNER TO new_owner− RENAME TO newtable− ADD table constraint definition− OWNER TO new owner正文更新
  26. PostgreSQL 7.1← 7.0语法变化

    sql-altertable.htm → sql-altertable.html

    + ALTER TABLE [ ONLY ] table [ * ]+ ALTER TABLE [ ONLY ] table [ * ]+ ALTER TABLE table+ OWNER TO new owner正文更新
  27. PostgreSQL 7.0← 6.5语法变化

    + ADD [ COLUMN ] column type+ ALTER TABLE table [ * ]+ ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT }+ ALTER TABLE table [ * ]+ RENAME [ COLUMN ] column TO newcolumn+ ALTER TABLE table+ ADD table constraint definition− [ * ] ADD [ COLUMN ] ER">coBLE> type− [ * ] RENAME [ COLUMN ] ER">coBLE> TO newcolumn正文更新
  28. PostgreSQL 6.5← 6.4语法变化

    + [ * ] ADD [ COLUMN ] ER">coBLE> type+ [ * ] RENAME [ COLUMN ] ER">coBLE> TO newcolumn− [ * ] ADD [ COLUMN ] column type− ALTER TABLE table− [ * ] RENAME [ COLUMN ] column TO newcolumn正文更新

同组命令

命令动词对象版本变动最近变更
TABLES & VIEWS表与视图15 条↑
TRUNCATETRUNCATE— 8.43 次
清空一个表或一组表现存
CREATE MATERIALIZED VIEWCREATEMATERIALIZED VIEW 122 次
定义一个新物化视图现存
ALTER MATERIALIZED VIEWALTERMATERIALIZED VIEW 168 次
更改一个物化视图的定义现存
DROP MATERIALIZED VIEWDROPMATERIALIZED VIEW —
移除一个物化视图现存
REFRESH MATERIALIZED VIEWREFRESHMATERIALIZED VIEW 9.41 次
替换物化视图的内容现存
CREATE SEQUENCECREATESEQUENCE 188 次
定义一个新的序列发生器现存
ALTER SEQUENCEALTERSEQUENCE 1810 次
更改序列发生器的定义现存
DROP SEQUENCEDROPSEQUENCE 8.23 次
移除一个序列现存
CREATE TABLECREATETABLE 1920 次
定义一个新表现存
ALTER TABLEALTERTABLE 1826 次
更改一个表的定义现存
DROP TABLEDROPTABLE 8.23 次
移除一个表现存
CREATE TABLE ASCREATETABLE AS 1911 次
根据查询结果定义一个新表现存
CREATE VIEWCREATEVIEW 9.47 次
定义一个新视图现存
ALTER VIEWALTERVIEW 145 次
更改视图的定义现存
DROP VIEWDROPVIEW 8.24 次
移除一个视图现存