ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# ALTER FOREIGN TABLE ## Name ALTER FOREIGN TABLE -- 修改外部表的定义 ## Synopsis ``` 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_'] [, ... ]) OWNER TO _new_owner_ OPTIONS ( [ ADD | SET | DROP ] _option_ ['_value_'] [, ... ]) ``` ## 描述 `ALTER FOREIGN TABLE` 修改一个外部表的定义。这里有好几种形式: `ADD COLUMN` 这种形式为外部表增加一个字段,语法同[CREATE FOREIGN TABLE](#calibre_link-0)。 与向常规表增加字段不同,外部表增加字段不会引起存储空间的变化,这种操作简单地声明了外部表是可获得这些新字段。 `DROP COLUMN [ IF EXISTS ]` 这种形式删除外部表的一个字段。如果表中的该字段被该表之外的其他对象依赖, 那就需要增加`CASCADE`;比如依赖该字段的视图。 如果指定了`IF EXISTS`,则在字段不存在时也不会 报错,只是产生一个注意信息。 `IF EXISTS` 如果外部表不存在,不会报错,而是产生一个注意信息。 `SET DATA TYPE` 这种形式修改一个外部表字段的数据类型。 `SET`/`DROP DEFAULT` 这种形式为一个字段设置或者删除缺省值。缺省值只应用于随后的 `INSERT`或`UPDATE`命令; 它们不会导致已经在表中的数值的修改。 `SET`/`DROP NOT NULL` 标志一个字段是否允许为空值。 `SET STATISTICS` 这个形式为随后的[ANALYZE](#calibre_link-589)操作设置每字段的统计收集目标。 更多细节请参考类似形式的[ALTER TABLE](#calibre_link-88) `SET (` `_attribute_option_` = `_value_` [, ... ] ) `RESET (` `_attribute_option_` [, ... ] ) 这种形式设置或重设每一个属性选项,更多细节,参考[ALTER TABLE](#calibre_link-88) `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` 如果有依赖于此字段的对象,则拒绝删除该字段。这是缺省行为。 `_new_owner_` 该表的新所有者的用户名。 `_new_schema_` 表将要移植到的新的模式名称 ## 注意 关键字 `COLUMN` 是多余的,可以省略。 通过`ADD COLUMN`添加字段,或通过`DROP COLUMN`删除字段, 或通过添加`NOT NULL`进行约束,或通过`SET DATA TYPE`修改字段的数据类型, 都不会检查数据一致性。确保表定义和远端表定义相匹配是用户的责任。 参考[CREATE FOREIGN TABLE](#calibre_link-0) 部分获取更多有效参数的描述。 ## 示例 设定一个字段不为空: ``` 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中不允许字段的表。