ALTER TABLE
Name
ALTER TABLE -- 修改表的定义
Synopsis
ALTER TABLE [ ONLY ] name [ * ]
action [, ... ]
ALTER TABLE [ ONLY ] name [ * ]
RENAME [ COLUMN ] column TO new_column
ALTER TABLE name
RENAME TO new_name
ALTER TABLE name
SET SCHEMA new_schema
ALTER TABLE 表名
ADD CONSTRAINT 约束名 --可以是任意合法标示符
UNIQUE (字段列表) -- 字段列表可以使多个字段,用','分开。
这里 action 是下列之一:
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 }
ADD table_constraint
DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
DISABLE TRIGGER [ trigger_name | ALL | USER ]
ENABLE TRIGGER [ trigger_name | ALL | USER ]
CLUSTER ON index_name
SET WITHOUT CLUSTER
SET WITHOUT OIDS
OWNER TO new_owner
SET TABLESPACE new_tablespace
描述
ALTER TABLE 变更一个现存表的定义。它有好几种子形式:
ADD COLUMN
这种形式用和 CREATE TABLE 里一样的语法向表中增加一个新的字段。
DROP COLUMN
这种形式从表中删除一个字段。请注意,和这个字段相关的索引和表约束也会被自动删除。如果任何表之外的对象依赖于这个字段, 你必须说 CASCADE,比如,外键参考,视图等等。
ALTER COLUMN TYPE
这种类型改变表中一个字段的类型。该字段涉及的索引和简单的表约束将被自动地转换为使用新的字段类型,方法是重新分析最初提供的表达式。可选的 USING 子句声明如何从旧的字段值里计算新的字段值;如果省略,那么缺省的转换就是从旧类型像新类型的赋值转换。如果从旧数据类型到新类型没有隐含或者赋值的转 换,那么必须提供一个 USING。
SET/DROP DEFAULT
这种形式为一个字段设置或者删除缺省值。请注意缺省值只应用于随后的 INSERT 命令;它们不会导致已经在表中的行的数值的修改。我们也可以为视图创建缺省,这个时候它们是在视图的 ON INSERT 规则应用之前插入 INSERT 语句中去的。
SET/DROP NOT NULL
这些形式修改一个字段是否标记为允许 NULL 值或者是拒绝 NULL 值。如果表在字段中包含非空值,那么你只可以 SET NOT NULL。
SET STATISTICS
这个形式为随后的 ANALYZE 操作设置每字段的统计收集目标(default_statistics_target)。目标的范围可以在 0 到 1000 之内设置;另外,把他设置为 -1 则表示重新恢复到使用系统缺省的统计目标。 有关 PostgreSQL 查询规划器使用的统计信息的更多信息, 请参考Section 13.2。
SET STORAGE
这种形式为一个字段设置存储模式。这个设置控制这个字段是内联保存还是保存在一个附属的表里,以及数据是否要压缩。 PLAIN 必需用于定长的数值,比如 integer,并且是内联的,不压缩的。 MAIN 用于内联,可压缩的数据。 EXTERNAL 用于外部保存,不压缩的数据, 而 EXTENDED 用于外部的压缩数据。 EXTENDED 是大多数支持非 PLAIN 存储的数据之缺省。使用 EXTERNAL 将令在 text 字段上的子字串操作更快, 付出的代价是增加了存储空间。 请注意 SET STORAGE 本身并不改变表上的任何东西,只是设置将来的表操作时,建议使用的策略。参阅 Section 50.2 获取更多信息。
ADD table_constraint
这个形式给表增加一个新的约束,用的语法和 CREATE TABLE 一样。
DROP CONSTRAINT
这个形式删除一个表上的约束。目前,在表上的约束不要求有唯一的名字,因此可能有多个约束匹配声明的名字。所有这样的约束都将被删除。
DISABLE/ENABLE TRIGGER
这个形式关闭或者打开属于该表的触发器。一个被关闭掉的触发器是系统仍然知道的,但是在触发器事件发生的时候不会被执行。对于一个推迟了的触发器,在事件 发生的时候会检查打开状态,而不是在函数实际执行的时候。我们可以通过申明名字的方法打开或者关闭任意一个触发器,或者是该表上的所有触发器,或者只是用 户触发器(这个选项排除了那些用于实现外键约束的触发器)。打开或者关闭约束触发器要求超级用户权限;这么做的时候应该小心,因为如果触发器不执行的话, 约束保证的数据完整性也就没有办法确保了。
CLUSTER
这种形式为将来的 CLUSTER 选项选择缺省索引。它实际上并不重新对表建簇。
SET WITHOUT CLUSTER
这种形式从表中删除最新使用的 CLUSTER 索引。 这样会影响将来那些没有声明索引的建簇操作。
SET WITHOUT OIDS
这种形式从表中删除 oid 系统字段。 它和 DROP COLUMN oid RESTRICT 完全相同, 只不过是如果表上已经没有 oid 字段了,那么它不会报告错误。
请注意,不存在某种 ALTER TABLE 的变种可以在删除了 OID 之后再把它们恢复回来。
RENAME
RENAME 形式改变一个表的名字(或者是一个索引,一个序列,或者一个视图)或者是表中一个独立字段的名字。它对存储的数据没有任何影响。
OWNER
这个形式改变表,序列或者视图的所有者为指定所有者。
SET TABLESPACE
这种形式把表的表空间修改为指定的表空间并且把与表相关的数据文件移动到新的表空间去。如果在表上呦索引,则不会移动。但是他们可以通过额外的 SET TABLESPACE 命令移动。参阅 CREATE TABLESPACE。
RENAME
RENAME 形式改变一个表(或者一个索引,序列,或者视图)的名字,或者是表中独立字段的名字。它们对存储的数据没有影响。
SET SCHEMA
这种形式把表移动到另外一个模式。相关的索引,约束,以及 SERIAL 字段的序列都跟着移动。
除了 RENAME 和 SET SCHEMA 之外所有动作都可以捆绑再一个多次修改的列表中同时施用。比如,我们可以在一个命令里增加几个字段和/或修改几个字段的类型。对于大表,这么做特别有用,因为只需要对该表做一次处理。
要使用 ALTER TABLE,你必需拥有该表。要修改一个表的模式,你必须在新的模式上有 CREATE 权限。要修改所有者,你必须还是新的所有角色的直接或者间接的成员,并且该角色在该表的模式上必须拥有 CREATE 权限。(这样的限制就保证了修改所有者这个动作和删除、重建该表能做到的动作没有什么区别。不过,超级用户可以修改任何表的所有者。)
参数
table
试图更改的现存表(可能有模式修饰)的名称。 如果声明了 ONLY,则只更改该表。如果没有声明 ONLY,则该表及其所有后代表(如果有)都被更新。我们可以在表名字后面附加一个 * 表示后代表都被扫描,但是在目前的版本里,这是缺省行为。(在7.1之前的版本,ONLY 是缺省的行为。)缺省可以通过改变配置选项 sql_inheritance 来改变。
column
现存或新的字段名称。
new_column
现存字段的新名称。
new_name
表的新名称。
type
新字段的类型,或者现存字段的新类型。
table_constraint
表的新的约束定义。
constraint_name
要删除的现有约束的名字。
trigger_name
要打开或者关闭的单个触发器的名字。
ALL
打开或者关闭属于该表的所有触发器。(如果这些触发器中有外键约束,那么就要求超级用户权限。)
USER
打开或者关闭所有属于该表的非外键约束触发器。
index_name
要标记为建簇的表上面的索引名字。
CASCADE
自动删除依赖于被依赖字段或者约束的对象(比如,引用该字段的视图)。
RESTRICT
如果字段或者约束还有任何依赖的对象,则拒绝删除该字段。这是缺省行为。
new_owner
该表的新所有者的用户名。
new_tablespace
这个表将要移动往的表空间名字。
new_schema
表将移动前往的模式的名字。
浙公网安备 33010602011771号