=================== ALTER FOREIGN TABLE =================== .. container:: refentry :name: SQL-ALTERFOREIGNTABLE .. container:: titlepage .. container:: refnamediv .. rubric:: ALTER FOREIGN TABLE :name: alter-foreign-table ALTER FOREIGN TABLE — 更改一个外部表的定义 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ] name [ * ] action [, ... ] ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ] name [ * ] RENAME [ COLUMN ] column_name TO new_column_name ALTER FOREIGN TABLE [ IF EXISTS ] name RENAME TO new_name ALTER FOREIGN TABLE [ IF EXISTS ] name SET SCHEMA new_schema 其中 action 是以下之一: 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 ] 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 } ALTER [ COLUMN ] column_name OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ]) ADD table_constraint [ NOT VALID ] 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 SET WITHOUT OIDS INHERIT parent_table NO INHERIT parent_table OWNER TO { new_owner | CURRENT_USER | SESSION_USER } OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ]) .. container:: refsect1 :name: id-1.9.3.13.5 .. rubric:: 描述 :name: 描述 ``ALTER FOREIGN TABLE``\ 更改一个现有外部表的定义。 有几种子形式: .. container:: variablelist ``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 WITHOUT OIDS`` 向后兼容性语法,表示移除\ ``oid``\ 系统列。 由于不能再为外部表添加\ ``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``\ 特权。 .. container:: refsect1 :name: id-1.9.3.13.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist *``name``* 一个要修改的现有外部表的名称(可以被模式限定)。如果在表名前指定了 ``ONLY``\ ,则只有该表被修改。如果没有指定\ ``ONLY``\ , 该表和它所有的后代表(如果有)都会被修改。可选地,在表名后面指定 ``*``\ 可以显式地表示将后代表包括在内。 *``column_name``* 一个新的或者现有列的名称。 *``new_column_name``* 一个现有列的新名称。 *``new_name``* 该表的新名称。 *``data_type``* 新列的数据类型或者一个现有列的新数据类型。 *``table_constraint``* New table constraint for the foreign table. *``constraint_name``* Name of an existing constraint to drop. ``CASCADE`` 自动删除依赖于被删除列或约束的对象(例如,引用该列的视图), 并且接着删除依赖于那些对象的 所有对象(见\ `第 5.14 节 `__\ )。 ``RESTRICT`` 如果有任何依赖对象就拒绝删除该列或约束。这是默认行为。 *``trigger_name``* 要禁用或启用的一个触发器的名称。 ``ALL`` 禁用或者启用所有属于该外部表的触发器(如果任何触发器是内部生成 的触发器,这都要求超级用户特权。核心系统不会向外部表增加这类触发 器,但是附加代码会这样做。)。 ``USER`` 禁用或者启用属于该外部表的除了内部生成的触发器之外的所有触发器。 *``parent_table``* 要与这个外部表关联或者解除关联的父表。 *``new_owner``* 该表的新拥有者的用户名。 *``new_schema``* 该表要被移动到其中的模式的名称。 .. container:: refsect1 :name: id-1.9.3.13.7 .. rubric:: 注解 :name: 注解 关键词\ ``COLUMN``\ 是噪声词并且可以被忽略。 当使用\ ``ADD COLUMN``\ 或 ``DROP COLUMN``\ 增加或移除一列、增加一个\ ``NOT NULL`` 或者\ ``CHECK`` 约束或者用\ ``SET DATA TYPE``\ 更改一个列类型时,不会检查与外部服务器的一 致性。确保该表定义匹配远端是用户的责任。 关于有效参数的进一步描述可参考\ `CREATE FOREIGN TABLE `__\ 。 .. container:: refsect1 :name: id-1.9.3.13.8 .. rubric:: 示例 :name: 示例 要把一列标记为非空: .. code:: programlisting ALTER FOREIGN TABLE distributors ALTER COLUMN street SET NOT NULL; 要更改一个外部表的选项: .. code:: programlisting ALTER FOREIGN TABLE myschema.distributors OPTIONS (ADD opt1 'value', SET opt2 'value2', DROP opt3 'value3'); .. container:: refsect1 :name: id-1.9.3.13.9 .. rubric:: 兼容性 :name: 兼容性 形式\ ``ADD``\ 、\ ``DROP``\ 以及 ``SET DATA TYPE``\ 符合 SQL 标准。其他形式是 SQL 标准的 PostgreSQL扩展。在一个 ``ALTER FOREIGN TABLE``\ 命令中指定多于一个操作也是一种扩展。 ``ALTER FOREIGN TABLE DROP COLUMN``\ 可以被用来删除 一个外部表的唯一一列,从而留下一个没有列的表。这是一种 SQL 的扩展,它 允许没有列的外部表。 .. container:: refsect1 :name: id-1.9.3.13.10 .. rubric:: 另见 :name: 另见 `CREATE FOREIGN TABLE `__, `DROP FOREIGN TABLE `__