ALTER FOREIGN TABLE — 更改一个外部表的定义
ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ]name
[ * ]action
[, ... ] ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ]name
[ * ] RENAME [ COLUMN ]column_name
TOnew_column_name
ALTER FOREIGN TABLE [ IF EXISTS ]name
RENAME TOnew_name
ALTER FOREIGN TABLE [ IF EXISTS ]name
SET SCHEMAnew_schema
其中action
是以下之一: ADD [ COLUMN ]column_name
data_type
[ COLLATEcollation
] [column_constraint
[ ... ] ] DROP [ COLUMN ] [ IF EXISTS ]column_name
[ RESTRICT | CASCADE ] ALTER [ COLUMN ]column_name
[ SET DATA ] TYPEdata_type
[ COLLATEcollation
] ALTER [ COLUMN ]column_name
SET DEFAULTexpression
ALTER [ COLUMN ]column_name
DROP DEFAULT ALTER [ COLUMN ]column_name
{ SET | DROP } NOT NULL ALTER [ COLUMN ]column_name
SET STATISTICSinteger
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 } ALTER [ COLUMN ]column_name
OPTIONS ( [ ADD | SET | DROP ]option
['value
'] [, ... ]) ADDtable_constraint
[ NOT VALID ] VALIDATE CONSTRAINTconstraint_name
DROP CONSTRAINT [ IF EXISTS ]constraint_name
[ RESTRICT | CASCADE ] DISABLE TRIGGER [trigger_name
| ALL | USER ] ENABLE TRIGGER [trigger_name
| ALL | USER ] ENABLE REPLICA TRIGGERtrigger_name
ENABLE ALWAYS TRIGGERtrigger_name
SET WITH OIDS SET WITHOUT OIDS INHERITparent_table
NO INHERITparent_table
OWNER TO {new_owner
| CURRENT_USER | SESSION_USER } OPTIONS ( [ ADD | SET | DROP ]option
['value
'] [, ... ])
ALTER FOREIGN TABLE
更改一个现有外部表的定义。
有几种子形式:
ADD COLUMN
这种形式使用与CREATE FOREIGN TABLE相同的语法把 一个新的列增加到该外部表。和为常规表增加一列不同,这种形式并不影响底层 的存储:这个动作只是简单地声明通过该外部表可以访问某个新的列而已。
DROP COLUMN [ IF EXISTS ]
这种形式从一个外部表删掉一列。如果在该表外部有任何东西依赖于该列,
你将需要写上CASCADE
,典型的例子就是视图。如果指定了
IF EXISTS
并且该列不存在,将不会抛出错误。在这种
情况下会转而发出一个提示。
SET DATA TYPE
这种形式更改一个外部表的一列的类型。同样,这种形式并不影响底层 的存储:这个动作只是简单地更改PostgreSQL 相信该列所具有的类型。
SET
/DROP DEFAULT
这些形式设置或者移除一列的默认值。默认值只会应用于后续的
INSERT
或UPDATE
命令,它们
不会导致已经在表中的行被更改。
SET
/DROP NOT NULL
把一列标记为允许或者不允许空值。
SET STATISTICS
这种形式为后续的ANALYZE操作设置针对每列 的统计收集目标。详见ALTER TABLE的类似形式。
SET ( attribute_option
= value
[, ... ] )
RESET ( attribute_option
[, ... ] )
这种形式设置或重置针对每个属性的选项。详见ALTER TABLE 的类似形式。
SET STORAGE
这种形式设置一个列的存储模式。详见 ALTER TABLE中类似的模式。注意存储模式 不会产生效果,除非该表的外部数据包装器选择处理它。
ADD table_constraint
[ NOT VALID ]
这种形式为外部表增加一个新的约束,使用的语法和
CREATE FOREIGN TABLE中相同。当前只
支持CHECK
约束。
和向常规表增加约束的情况不同,为外部表增加约束时不会做任何事情来
验证该约束是否正确。这个动作只是简单地声明了该外部表中所有的行都
应该满足的某种新的条件(见
CREATE FOREIGN TABLE中的讨论)。如果该
约束被标记为NOT VALID
,那么它不被假设为有效,而只是
被记录下来以备未来使用。
VALIDATE CONSTRAINT
这种形式把一个之前被标记为NOT VALID
的约束标
记为有效。不会做任何动作来验证该约束,但是未来的查询将会假定该
约束是保持的。
DROP CONSTRAINT [ IF EXISTS ]
这种形式删掉在一个外部表上的指定约束。如果指定了
IF EXISTS
但约束并不存在,则不会抛出错误。
在这种情况下会发出一个提示。
DISABLE
/ENABLE [ REPLICA | ALWAYS ] TRIGGER
这些形式配置属于该外部表的触发器的触发情况。详见 ALTER TABLE的类似形式。
SET WITH OIDS
这种形式为表增加一个oid
系统列(见
Section 5.4)。如果该表已经有 OID,则
这种形式不会做任何事情。除非该表的外部数据包装器支持 OID,这个列
将被简单地读作零。
注意这和ADD COLUMN oid oid
并不等效,后者将增加
一个刚好名字为oid
的普通列而不是一个系统列。
SET WITHOUT OIDS
这种形式从表移除oid
系统列。这正好
等效于DROP COLUMN oid RESTRICT
,
不过如果表上已经没有oid
时它不会做出
提示或者报错。
INHERIT parent_table
这种形式把目标外部表作为指定的父表的新后代。详见 ALTER TABLE的类似的形式。
NO INHERIT parent_table
这种形式把目标外部表从指定的父表的子女列表中移除。
OWNER
这种形式把该外部表的拥有者改成指定的用户。
OPTIONS ( [ ADD | SET | DROP ] option
['value
'] [, ... ] )
更改该外部表或者其中一个列的选项。ADD
、SET
以及DROP
指定要执行的动作。如果没有显式地指定操作,将假定
为ADD
。不允许重复的名称(不过一个表选项和一个列选项可以重
名)。选项名称和值也会用外部数据包装器库来验证。
RENAME
RENAME
形式更改外部表的名称或者外
部表中一个列的名称。
SET SCHEMA
这种形式把外部表移动到另一个模式中。
所有除了RENAME
和SET SCHEMA
的
动作都能被整合到一个多修改列表以便能被并行应用。例如,可以在一个
命令中增加几个列并且/或者修改几个列的类型。
如果该命令被写作ALTER FOREIGN TABLE IF EXISTS ...
并且
该外部表不存在,则不会抛出错误。这种情况下会发出一个提示。
你必须拥有该表以使用ALTER FOREIGN TABLE
。要更改一个
外部表的模式,你必须还拥有新模式上的CREATE
特权。要
更改拥有者,你还必须是新拥有角色的一个直接或者间接成员,并且该角色必须
具有在该表的模式上的CREATE
特权(这些限制强制修改拥有
者不能做一些通过删除和重建该表做不到的事情。不过,一个超级用户怎么都能
更改任何表的所有权)。要增加一列或者修改一个列的类型,你还必须具有该数
据类型上的USAGE
特权。
name
一个要修改的现有外部表的名称(可以被模式限定)。如果在表名前指定了
ONLY
,则只有该表被修改。如果没有指定ONLY
,
该表和它所有的后代表(如果有)都会被修改。可选地,在表名后面指定
*
可以显式地表示将后代表包括在内。
column_name
一个新的或者现有列的名称。
new_column_name
一个现有列的新名称。
new_name
该表的新名称。
data_type
新列的数据类型或者一个现有列的新数据类型。
table_constraint
外部表的新的表约束。
constraint_name
要删除的现有约束的名称。
CASCADE
自动删除依赖于被删除列或约束的对象(例如,引用该列的视图), 并且接着删除依赖于那些对象的 所有对象(见Section 5.13)。
RESTRICT
如果有任何依赖对象就拒绝删除该列或约束。这是默认行为。
trigger_name
要禁用或启用的一个触发器的名称。
ALL
禁用或者启用所有属于该外部表的触发器(如果任何触发器是内部生成 的触发器,这都要求超级用户特权。核心系统不会向外部表增加这类触发 器,但是附加代码会这样做。)。
USER
禁用或者启用属于该外部表的除了内部生成的触发器之外的所有触发器。
parent_table
要与这个外部表关联或者解除关联的父表。
new_owner
该表的新拥有者的用户名。
new_schema
该表要被移动到其中的模式的名称。
关键词COLUMN
是噪声词并且可以被忽略。
当使用ADD COLUMN
或
DROP COLUMN
增加或移除一列、增加一个NOT NULL
或者CHECK
约束或者用SET DATA TYPE
更改一个列类型时,不会检查与外部服务器的一
致性。确保该表定义匹配远端是用户的责任。
关于有效参数的进一步描述可参考CREATE FOREIGN TABLE。
要把一列标记为非空:
ALTER FOREIGN TABLE distributors ALTER COLUMN street SET NOT NULL;
要更改一个外部表的选项:
ALTER FOREIGN TABLE myschema.distributors OPTIONS (ADD opt1 'value', SET opt2 'value2', DROP opt3 'value3');
形式ADD
、DROP
以及
SET DATA TYPE
符合 SQL 标准。其他形式是 SQL 标准的
PostgreSQL扩展。在一个
ALTER FOREIGN TABLE
命令中指定多于一个操作也是一种扩展。
ALTER FOREIGN TABLE DROP COLUMN
可以被用来删除
一个外部表的唯一一列,从而留下一个没有列的表。这是一种 SQL 的扩展,它
允许没有列的外部表。