PostgreSQL 9.4.4 中文手册
上一页 | 上一级 |  | 下一页

# ALTER FOREIGN TABLE

## 名称

ALTER FOREIGN TABLE -- 修改外部表的定义

## 大纲

    ALTER FOREIGN TABLE [ IF EXISTS ] name
        action [, ... ]
    ALTER FOREIGN TABLE [ IF EXISTS ] 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
        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 OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ])
        DISABLE TRIGGER [ trigger_name | ALL | USER ]
        ENABLE TRIGGER [ trigger_name | ALL | USER ]
        ENABLE REPLICA TRIGGER trigger_name
        ENABLE ALWAYS TRIGGER trigger_name
        OWNER TO new_owner
        OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ])

## 描述

`ALTER FOREIGN TABLE` 修改一个外部表的定义。这里有好几种形式:

`ADD COLUMN`

  这种形式为外部表增加一个字段，语法同CREATE FOREIGN TABLE。 与向常规表增加字段不同，外部表增加字段不会引起存储空间的变化，这种操作简单地声明了外部表是可获得这些新字段。

`DROP COLUMN [ IF EXISTS ]`

  这种形式删除外部表的一个字段。如果表中的该字段被该表之外的其他对象依赖， 那就需要增加`CASCADE`；比如依赖该字段的视图。 如果指定了`IF EXISTS`，则在字段不存在时也不会 报错,只是产生一个通知。

`IF EXISTS`

  如果外部表不存在，不会报错，而是产生一个通知。

`SET DATA TYPE`

  这种形式修改一个外部表字段的数据类型。

`SET`/`DROP DEFAULT`

  这种形式为一个字段设置或者删除缺省值。缺省值只应用于随后的 `INSERT`或`UPDATE`命令； 它们不会导致已经在表中的数值的修改。

`SET`/`DROP NOT NULL`

  标志一个字段是否允许为空值。

`SET STATISTICS`

  这个形式为随后的ANALYZE操作设置每字段的统计收集目标。 更多细节请参考类似形式的ALTER TABLE

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

  这种形式设置或重设每一个属性选项，更多细节，参考ALTER TABLE

`DISABLE`/`ENABLE [ REPLICA | ALWAYS ] TRIGGER`

  这个格式配置触发器的触发属于外部表。参阅相似格式ALTER TABLE 获取更多信息。

`OWNER`

  这个形式改变外部表的所有者为指定所有者

`RENAME`

  `RENAME`形式改变一个外部表的名字或者是外部表中一个独立字段的名字。

`SET SCHEMA`

  这种形式把外部表从一个模式移植到另一个模式。

`OPTIONS ( [ ADD | SET | DROP ] `option` ['`value`'] [, ... ] )`

  改变外部表或者外部表字段的选项。`ADD`, `SET`, 和`DROP` 指定执行的操作。 如果没有显式设置操作，那么默认就是ADD。选项的名字不允许重复(尽管表选项和表字段选项可以有相同的名字)。 选项的名称和值也会通过外部数据封装器的类库库进行校验。

除 `RENAME` 和`SET SCHEMA`之外的操作都可以写组合在一起，同时执行。 例如，在单一一条命令中，可以添加多个列和（或者）修改多个列的数据类型。

你必须是表的所有者才能使用`ALTER FOREIGN TABLE`命令。 要修改外部表的模式，必须在被修改的新模式中拥有`CREATE`权限。 要改变外部表的所有权，你必须是新角色的直接或间接成员，并且这个新角色必须在该表的模式上具有 `CREATE` 权限。（这强制限制在进行更改所有者的操作时，如果无法通过删除后重建表的方式完成，那么就不能做任何事。不过，超级用户可以用任何方法任意更改表的所有者。） 要增加一个字段或修改一个字段类型，必须在数据类型上有`USAGE` 权限

## 参数

`name`

  待修改的已存在外部表的名字（可以用模式修饰）。

`column_name`

  现存或新的字段名称。

`new_column_name`

  字段的新名称

`new_name`

  表的新名称

`data_type`

  新字段的类型，或者现存字段的新类型。

`CASCADE`

  自动删除依赖于被删除字段的对象 （比如，引用该字段的视图）。

`RESTRICT`

  如果有依赖于此字段的对象，则拒绝删除该字段。这是缺省行为。

`trigger_name`

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

`ALL`

  禁用或启用所有属于该外部表的触发器。（如果有任何触发器是内部生成的， 那么需要超级用户权限。内核系统并不添加这样的触发器到外部表， 但是附加的代码能够这样做。）

`USER`

  禁用或启用所有属于该外部表的触发器，除了内部生成的触发器。

`new_owner`

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

`new_schema`

  表将要移植到的新的模式名称

## 注意

关键字 `COLUMN` 是多余的，可以省略。

通过`ADD COLUMN`添加字段，或通过`DROP COLUMN`删除字段， 或通过添加`NOT NULL`进行约束，或通过`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标准。 其他形式是PostgreSQL的扩展。另外，一个`ALTER FOREIGN TABLE`命 令中设置多个操作的功能也是扩展。

`ALTER FOREIGN TABLE DROP COLUMN` 可以删除外部表中的仅有的唯一一个列， 删除之后就是一个无字段的表。这个特性是PostgreSQL的扩展，标准SQL中不允许字段的表。

上一页 | 起始页 | 下一页
ALTER FOREIGN DATA WRAPPER | 上一级 | ALTER FUNCTION