虽然CREATE TABLE允许在WITH (storage_parameter)语法中指定 OIDS,但是 ALTER TABLE没有把OIDS当作一个存储 参数,而是使用SET WITH OIDS 和SET WITHOUT OIDS形式来更改 OID 状态。 RESET ( storage_parameter [, ... ] )这种形式把一个或者更多存储参数重置到它们的默认值。和 SET一样,可能需要一次表重写来更新整个表。 INHERIT parent_table这种形式把目标表增加为指定父表的一个新子女。随后,针对父亲的查询将 包括目标表中的记录。要被增加为一个子女,目标表必须已经包含和父表完 全相同的列(也可以有额外的列)。这些列必须具有匹配的数据类型,并且 如果它们在父表中具有NOT NULL约束,它们在子表中 也必须有NOT NULL约束。 也必须把子表约束与所有父表的CHECK约束进行匹配, 不过父表中那些被标记为非可继承(也就是用ALTER TABLE ... ADD CONSTRAINT ... NO INHERIT 创建的)除外,它们会被忽略。所有匹配得上的子表约束不能被标记为不可 继承。当前,UNIQUE、PRIMARY KEY 以及FOREIGN KEY约束没有被考虑,但是这种情况可能 会在未来发生变化。 NO INHERIT parent_table这种形式把目标表从指定父表的子女列表中移除。针对父表的查询将不再包括 来自目标表的记录。 OF type_name这种形式把该表链接到一种组合类型,就好像CREATE TABLE OF所做的那样。该表的列名和类型列表必须精确地匹配 该组合类型。oid系统列的存在情况可以不同。该表必须 不从任何其他表继承。这些限制确保 CREATE TABLE OF能允许一个等价的表定义。 NOT OF这种形式解除一个有类型的表和其类型之间的关联。 OWNER这种形式把表、序列、视图、物化视图或外部表的拥有者改为指定用户。 REPLICA IDENTITY这种形式更改被写入到预写式日志来标识被更新或删除行的信息。除非使用逻辑复制, 这个选项将不会产生效果。DEFAULT(非系统表的默认值)记录主键列 (如果有)的旧值。USING INDEX记录被所提到的索引所覆盖的列的 旧值,该索引必须是唯一索引、不是部分索引、不是可延迟索引并且只包括被标记成 NOT NULL的列。FULL记录行中所有列的旧值。 NOTHING不记录有关旧行的任何信息(这是系统表的默认值)。在所 有情况下,除非至少有一个要被记录的列在新旧行版本之间发生变化,将不记录旧值。 RENAMERENAME形式更改一个表(或者一个索引、序列、视图、物化视图 或者外部表)的名称、表中一个列的名称或者表的一个约束的名称。它对已存储的数据 没有影响。 SET SCHEMA这种形式把该表移动到另一个模式中。相关的该表列拥有的索引、约束和序列也会被 移动。 ATTACH PARTITION partition_name FOR VALUES partition_bound_spec这种形式使用与CREATE TABLE相同的 partition_bound_spec语法, 将现有的表(可能本身是分区)作为目标表的分区。 分区绑定规范必须对应于目标表的分区策略和分区键。 要绑定的表必须与目标表具有相同的列,而不能再多;此外, 列类型也必须匹配。此外,它必须具有目标表的所有 NOT NULL和CHECK约束。 目前没有考虑UNIQUE、PRIMARY KEY 和FOREIGN KEY约束。 如果附加表的任意CHECK约束被标记为NO INHERIT, 则该命令将失败;必须重新创建这样的约束,而不使用NO INHERIT子句。 如果新的分区是普通表,则执行一个全表扫描来检查表中的现有行是否违反分区约束。 可以通过给该表添加一个有效的CHECK约束来避免此扫描, 在执行此命令之前,只允许满足所需分区约束的行。将使用这样的约束来确定, 而不需要扫描表来验证分区约束。但是,如果任何分区键是表达式并且分区不接受 NULL值,这将起作用。如果附加一个不接受 NULL值的列表分区,除非它是一个表达式, 否则向分区键列添加NOT NULL约束。 如果新分区是外部表,则不会执行任何操作来验证外部表中的所有行都遵守分区约束。 (请参阅CREATE FOREIGN TABLE中关于外部表的约束的讨论。) DETACH PARTITION partition_name该形式分离目标表的指定分区。分离的分区作为独立表继续存在,变态天剑狂刀,但不再与分离的表相关联。 除了RENAME、SET SCHEMA、 ATTACH PARTITION和 DETACH PARTITION 之外的所有作用于单个表的ALTER TABLE形式可以整合到一个具有多个修改的列表中一起使用。例如,可以在一个命 令中增加一些列并且/或者修改一些列的类型。对于大型的表这是特别有用的, 因为只需要对表做一趟操作。 要使用ALTER TABLE,你必须拥有该表。要更改一个表的 模式或者表空间,你还必须拥有新模式或表空间上的 CREATE特权。要把一个表作为一个父表的新子表加入, 你必须也拥有该父表。另外,要将一个表附加为表的新分区,您必须拥有要附加的那个表。要更改拥有者,你还必须 是新拥有角色的一个直接或者间接成员,并且该角色必须具有该表的模式上的 CREATE特权(这些限制强制修改拥有者不能做一些通过删除和重 建表做不到的事情。不过,一个超级用户怎么都能更改任何表的所有权。)。 要增加一个列、修改一列的类型或者使用OF子句,你还必 须具有该数据类型上的USAGE特权。 |
