GreenPlum中的alter table语句

0    246    1

Tags:

👉 本文共约11737个字,系统预计阅读时间或需45分钟。

ALTER TABLE

更改一个表的定义。

概要

where partition_action is one of:

where partition_element is:

where subpartition_spec is:

and subpartition_element is:

where storage_parameter is:

描述

ALTER TABLE 更改一个表的定义。下文描述了几种形式:

  • ADD COLUMN — 向表中增加一个新列,使用和CREATE TABLE相同的语义。ENCODING 子句只有在追加和列存储表中有效

  • DROP COLUMN [IF EXISTS] — 从表中删除列。 请注意,如果删除用作Greenplum数据库分配键的表列,则表的分配策略将更改为DISTRIBUTED RANDOMLY.。 涉及该列的索引和表约束也会自动删除。 如果表外的任何内容都取决于列(例如视图),则需要指定CASCADE。 如果指定了IF EXISTS且该列不存在,则不会引发任何错误; 而是发出通知。

  • IF EXISTS — 如果表不存在,请不要抛出错误。 在这种情况下发出通知。

  • SET DATA TYPE — 此表单更改表的列的数据类型。 请注意,您不能更改用作分发键或分区键的列数据类型。 通过重新解析最初提供的表达式,涉及该列的索引和简单表约束将自动转换为使用新的列类型。 可选的COLLATE子句为新列指定排序规则,如果省略,则排序规则是新列类型的默认排序规则。 可选的USING子句指定如何从旧的值计算新的列值。 如果省略,则默认转换与从旧数据类型到新数据类型的转换相同。 如果没有从旧类型转换为新类型的隐式或赋值,则必须提供USING子句。

    Note: 仅当查询中的所有列使用相同的排序规则时,GPORCA才支持排序规则。 如果查询中的列使用不同的排序规则,则Greenplum使用Postgres Planner。

  • SET/DROP DEFAULT — 设置或删除列的默认值。 默认值仅适用于后续的INSERT或UPDATE命令。 它们不会导致表中已有的行发生更改。

  • SET/DROP NOT NULL — 更改是将列标记为允许空值还是拒绝空值。 当列不包含空值时,只能使用SET NOT NULL。

  • SET STATISTICS — 为后续的ANALYZE操作设置每个列的统计信息收集目标。 可以在100到10000的范围内设置目标,也可以设置为-1以使用系统默认统计信息目标(default_statistics_target)恢复为目标。

  • SET ( attribute_option = value [, … ])

    RESET ( attribute_option [, …] )— 设置或重置每个属性选项。当前,唯一定义的按属性的选项是 n_distinct 和n_distinct_inherited,它们覆盖了后续 ANALYZE 操作所做的不同值估计数。 n_distinct 影响表本身的统计信息,而n_distinct_inherited影响表及其继承子级收集的统计信息。当设置为正值时,ANALYZE将假定该列恰好包含指定数量的不同非空值。当设置为负值(必须大于或等于-1)时,ANALYZE将假定列中不同的非空值的数量在表的大小中是线性的;确切的计数应通过将估计的表大小乘以给定数字的绝对值来计算。例如,值-1表示该列中的所有值都是不同的,而值-0.5表示每个值平均出现两次。当表的大小随时间变化时,这很有用,因为直到查询计划时间才执行表中行数的乘法。将值指定为0可恢复为通常估计不同值的数量

  • ADD table_constraint [NOT VALID] — 使用与CREATE TABLE相同的语法向表(不仅仅是分区)添加新约束。 当前仅将NOT VALID选项用于外键和CHECK约束。 如果约束标记为NOT VALID,则Greenplum数据库将跳过可能冗长的初始检查,以验证表中的所有行均满足约束。 约束将仍然针对后续的插入或更新(即,对于外键而言,除非在引用表中有匹配的行,否则它们将失败;对于外键,除非新行与指定的检查匹配,否则它们将失败) 约束)。 但是,除非使用VALIDATE CONSTRAINT选项对其进行验证,否则数据库将不假定该约束对表中的所有行均有效。 创建表时将跳过约束检查,因此CREATE TABLE语法不包括此选项。

  • VALIDATE CONSTRAINT — 该形式通过扫描表以确保没有不满足该约束的行,从而验证了以前创建为NOT VALID的外键约束。 如果约束已被标记为有效,则什么也不会发生。 将验证与约束的初始创建分开的好处是,与约束创建相比,验证对表的锁定更少。

  • ADD table_constraint_using_index — 根据现有的唯一索引将新的 PRIMARY KEY 或 UNIQUE 约束添加到表中。 索引的所有列都将包含在约束中。 索引不能具有表达式列,也不能是部分索引。 另外,它必须是具有默认排序顺序的b树索引。 这些限制确保索引等于由常规ADD PRIMARY KEY或ADD UNIQUE命令建立的索引。

    如果指定了 PRIMARY KEY,并且索引的列尚未标记为NOT NULL,则此命令将尝试对每个此类列执行ALTER COLUMN SET NOT NULL。 这需要全表扫描,以验证列不包含空值。 在所有其他情况下,这是一个快速的操作。

    如果提供了约束名称,那么索引将被重命名以匹配约束名称。 否则,约束将被命名为与索引相同。

    执行此命令后,索引将由约束“拥有”,就像使用常规 ADD PRIMARY KEY或ADD UNIQUE命令构建索引一样。 特别是,删除约束将使索引也消失。

    Note: 在需要添加新约束而不长时间阻止表更新的情况下,使用现有索引添加约束可能会有所帮助。 为此,请使用 CREATE INDEX CONCURRENTLY 创建索引,然后使用此语法将其安装为正式约束。 请参见下面的示例。

  • DROP CONSTRAINT [IF EXISTS] — 将指定的约束放在表上。 如果指定了IF EXISTS且该约束不存在,则不会引发任何错误。 在这种情况下,将发出通知。

  • DISABLE/ENABLE TRIGGER — 禁用或启用属于该表的触发器。 禁用的触发器对于系统仍然是已知的,但是在其触发事件发生时不会执行。 对于延迟的触发器,将在事件发生时而不是在实际执行触发器功能时检查启用状态。 可以禁用或启用由名称指定的单个触发器,或表上的所有触发器,或仅由用户创建的触发器。 禁用或启用约束触发器需要超级用户特权。

    Note: Greenplum数据库中不支持触发器。 由于Greenplum数据库的并行性,触发器通常具有非常有限的功能。

  • CLUSTER ON/SET WITHOUT CLUSTER — 选择或删除默认索引以用于将来的CLUSTER操作。 它实际上并没有重新群集表。 请注意,建议不要使用CLUSTER对Greenplum数据库中的表进行物理重新排序,因为它会花费很长时间。 最好使用CREATE TABLE AS重新创建表并按索引列对其进行排序。

    Note: 追加优化表不支持CLUSTER ON。

  • SET WITH OIDS — 往表中添加一个系统列 oid。如果表中已有OID列则不会做任何操作, 这与ADD COLUMN oid oid的操作并不相等,ADD COLUMN oid oid会增加一个正常的名为oid的正常列,而不是增加一个系统列。OIDs不允许增加在分区表或者追加优化列组织表。

    Warning: Greenplum强烈建议您在创建表时不要启用OIDS。 在大型表(例如典型的Greenplum数据库系统中的表)上,对表行使用OID可能会导致32位OID计数器的折回。 一旦计数器回绕,就不能再认为OID是唯一的,这不仅使OID对用户应用程序无用,而且还会在Greenplum数据库系统目录表中引起问题。 此外,从表中排除OID会使每行将表存储在磁盘上所需的空间减少了每行4个字节,从而略微提高了性能。

  • SET WITHOUT OIDS — 从表中删除OID系统列。

  • SET ( FILLFACTOR = value) / RESET (FILLFACTOR) — 更改表的填充因子。 表格的填充系数是10到100之间的百分比。默认值为100(完全打包)。 当指定较小的填充因子时,INSERT操作仅将表页面打包到指定的百分比; 每个页面上的剩余空间都保留用于更新该页面上的行。 这样,UPDATE就有机会将行的更新副本与原始副本放置在同一页面上,这比将其放置在另一页面上更为有效。 对于一个条目从不更新的表,完全打包是最佳选择,但在更新频繁的表中,较小的填充因子是合适的。 请注意,此命令不会立即修改表内容。 您将需要重写表以获得所需的效果。 可以使用VACUUM或强制表重写的ALTER TABLE形式之一来完成。

  • SET DISTRIBUTED — 更改表的分配策略。 更改哈希分发策略,或更改为复制策略或从复制策略更改将导致表数据在磁盘上进行物理重新分发,这可能会占用大量资源。

  • INHERIT parent_table / NO INHERIT parent_table — 添加或删除目标表作为指定父表的子表。 对父级的查询将包括其子表的记录。 要作为子项添加,目标表必须已经包含与父项相同的所有列(它也可以具有其他列)。 这些列必须具有匹配的数据类型,并且如果它们在父级中具有NOT NULL约束,那么它们在子级中也必须具有NOT NULL约束。 对于父级的所有CHECK约束,还必须有匹配的子表约束,但在父级中标记为不可继承的(即用ALTER TABLE … ADD CONSTRAINT … NO INHERIT创建)的约束除外。 匹配的所有子表约束均不得标记为不可继承。 当前不考虑UNIQUE, PRIMARY KEY和 FOREIGN KEY约束,但是将来可能会改变。

  • OF type_name — 这种形式将表链接到复合类型,就像CREATE TABLE OF已经形成了它一样。 该表的列名和类型列表必须与组合类型的列表完全匹配; oid系统列的存在可以不同。 该表不得从任何其他表继承。 这些限制确保 CREATE TABLE OF将允许等效的表定义。

  • NOT OF — 这种形式将类型化表与其类型分离。

  • OWNER — 将表,序列或视图的所有者更改为指定的用户。

  • SET TABLESPACE — 将表的表空间更改为指定的表空间,并将与表关联的数据文件移动到新表空间。表中的索引(如果有)不会移动;但是可以使用其他SET TABLESPACE命令分别移动它们。可以使用ALL IN TABLESPACE表单移动表空间中当前数据库中的所有表,该表单将锁定所有要先移动的表,然后再移动每个表。此表单还支持OWNED BY,该操作仅移动指定角色所拥有的表。如果指定了NOWAIT选项,则如果该命令无法立即获取所有必需的锁,则该命令将失败。请注意,此命令不会移动系统目录,请根据需要使用ALTER DATABASE或显式ALTER TABLE调用。 information_schema关系不视为系统目录的一部分,将被移动。另请参见CREATE TABLESPACE。如果更改分区表的表空间,则所有子表分区也将移至新表空间。

  • RENAME — 更改表(或索引,序列或视图)的名称,表中单个列的名称或表的约束的名称。 对存储的数据没有影响。 请注意,Greenplum数据库分发密钥列不能重命名。

  • SET SCHEMA — 将表移到另一个架构。 表列拥有的关联索引,约束和序列也将移动。

  • ALTER PARTITION | DROP PARTITION | RENAME PARTITION | TRUNCATE PARTITION | ADD PARTITION | SPLIT PARTITION | EXCHANGE PARTITION | SET SUBPARTITION TEMPLATE — 更改分区表的结构。 在大多数情况下,您必须遍历父表才能更改其子表分区之一。

Note: 如果将分区添加到具有子分区编码的表中,则新分区将继承该子分区的存储指令。 有关压缩设置优先级的更多信息,请参阅Greenplum Database Administrator Guide中的“使用压缩”。

除 RENAME和SET SCHEMA之外,所有作用于单个表的ALTER TABLE形式都可以组合成多个更改列表以一起应用。 例如,可以在单个命令中添加几列和/或更改几列的类型。 这对于大型表尤其有用,因为只需要对表进行一次遍历。

您必须拥有该表才能使用ALTER TABLE。 要更改表的架构或表空间,您还必须对新架构或表空间具有CREATE特权。 要将表添加为父表的新子级,您还必须拥有父表。 要更改所有者,您还必须是新拥有角色的直接或间接成员,并且该角色必须对表的架构具有CREATE特权。 要添加列或更改列类型或使用OF子句,您还必须对数据类型具有USAGE特权。 超级用户自动具有这些特权。

Note: 如果表具有多个分区,表具有压缩功能或表的块大小很大,则内存使用量会显着增加。 如果与该表关联的关系的数量很大,则这种情况可能会迫使对该表进行的操作使用更多的内存。 例如,如果该表是一个CO表并具有大量列,则每个列都是一个关系。 诸如ALTER TABLE ALTER COLUMN之类的操作将打开表中的所有列,以分配关联的缓冲区。 如果CO表具有40列和100个分区,并且这些列被压缩并且块大小为2 MB(系统系数为3),则系统尝试分配24 GB,即(40×100)×(2× 3)MB或24 GB。

参数

ONLY

仅对指定的表名执行操作。 如果不使用 ONLY关键字,则将在命名表以及与该表关联的任何子表分区上执行该操作。

Note: 只允许在父表或子表中添加或删除列,或更改列的类型。 父表及其后代必须始终具有相同的列和类型。

name

要更改的现有表的名称(可能是模式限定的)。 如果ONLY指定,则仅更改该表。 如果未指定ONLY,则更新表及其所有后代表(如果有)。

Note: 约束只能添加到整个表,不能添加到分区。 由于该限制,name参数只能包含表名,而不能包含分区名。

column_name

新列或现有列的名称。 请注意,Greenplum数据库分发键列必须格外小心。 更改或删除这些列可以更改表的分发策略。

new_column_name

现有列的新名称。

new_name

表的新名称。

type

新列的数据类型,或现有列的新数据类型。 如果更改Greenplum分布键列的数据类型,则只能将其更改为兼容类型(例如,text到varchar可以,但text到int则不能)。

table_constraint

表的新表约束。 请注意,Greenplum数据库当前不支持外键约束。 此外,表仅允许一个唯一约束,并且唯一性必须在Greenplum数据库分发密钥内。

constraint_name

要删除的现有约束的名称。

CASCADE

自动删除依赖于已删除列或约束的对象(例如,引用该列的视图)。

RESTRICT

如果有任何相关对象,则拒绝删除列或约束。 这是默认行为。

trigger_name

要禁用或启用的单个触发器的名称。 请注意,Greenplum数据库不支持触发器。

ALL

禁用或启用属于该表的所有触发器,包括与约束相关的触发器。 如果任何触发器是内部生成的约束触发器(例如用于实现外键约束或可延迟的唯一性和排除约束的触发器),则这需要超级用户特权。

USER

禁用或启用属于该表的所有触发器,但内部生成的约束触发器(例如用于实现外键约束或可延迟的唯一性和排除约束的触发器除外)除外。

index_name

表应标记为集群的索引名称。 请注意,建议不要使用CLUSTER对Greenplum数据库中的表进行物理重新排序,因为它会花费很长时间。 最好使用CREATE TABLE AS重新创建表并按索引列对其进行排序。

FILLFACTOR

设置表格的填充系数百分比。

value

FILLFACTOR参数的新值,介于10到100之间的百分比。默认值为100。

DISTRIBUTED BY ({column_name [opclass]}) | DISTRIBUTED RANDOMLY | DISTRIBUTED REPLICATED

指定表的分发策略。 更改哈希分发策略会导致物理上重新分配表数据,这可能会占用大量资源。 如果声明相同的哈希分配策略或从哈希更改为随机分配,则除非声明SET WITH (REORGANIZE=true),否则不会重新分配数据。

更改为复制的分发策略或从复制的分发策略更改将导致表数据被重新分发。

REORGANIZE=true|false

当哈希分配策略未更改或从哈希更改为随机分配,并且无论如何都希望重新分配数据时,请使用REORGANIZE=true 。

parent_table

父表要与此表关联或取消关联。

new_owner

表的新所有者的角色名称。

new_tablespace

该表将被移动到的表空间的名称。

new_schema

表将被移动到的模式的名称。

parent_table_name

更改分区表时,顶级父表的名称。

ALTER [DEFAULT] PARTITION

如果要更改的分区比第一级分区深,请使用ALTER PARTITION子句指定要更改层次结构中的哪个子分区

DROP [DEFAULT] PARTITION

删除指定的分区。 如果分区具有子分区,则子分区也会自动删除。

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复