云数据库 GaussDB-ALTER TABLE PARTITION:语法格式

时间:2023-11-01 16:22:02

语法格式

  • 修改表分区主语法。
    ALTER TABLE [ IF EXISTS ] { table_name  [*] | ONLY table_name | ONLY ( table_name  )}    action [, ... ];
    其中action统指如下分区维护子语法。当存在多个分区维护子句时,保证了分区的连续性,无论这些子句的排序如何,GaussDB总会先执行DROP PARTITION再执行ADD PARTITION操作,最后顺序执行其它分区维护操作。
        move_clause  |    exchange_clause  |    row_clause  |    merge_clause  |    modify_clause  |    split_clause  |    add_clause  |    drop_clause  |    truncate_clause
    • move_clause子语法用于移动分区到新的表空间。
      MOVE PARTITION { partion_name | FOR ( partition_value [, ...] ) } TABLESPACE tablespacename
    • exchange_clause子语法用于把普通表的数据迁移到指定的分区。
      EXCHANGE PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) }     WITH TABLE {[ ONLY ] ordinary_table_name | ordinary_table_name * | ONLY ( ordinary_table_name )}     [ { WITH | WITHOUT } VALIDATION ] [ VERBOSE ] [ UPDATE GLOBAL INDEX ]

      进行交换的普通表和分区必须满足如下条件:

      • 普通表和分区的列数目相同,对应列的信息严格一致,包括:列名、列的数据类型、列约束、列的Collation信息、列的存储参数、列的压缩信息等。
      • 普通表和分区的表压缩信息严格一致。
      • 普通表和分区的索引个数相同,且对应索引的信息严格一致。
      • 普通表和分区的表约束个数相同,且对应表约束的信息严格一致。
      • 普通表不可以是临时表,分区表只能是范围分区表,列表分区表,哈希分区表或间隔分区表。
      • 普通表和分区表上不可以有动态数据脱敏,行访问控制约束。
      • 列表分区表,哈希分区表不能是列存储。
      • 完成交换后,普通表和分区的数据被置换,同时普通表和分区的表空间信息被置换。此时,普通表和分区的统计信息变得不可靠,需要对普通表和分区重新执行analyze。
      • 由于非分区键不能建立本地唯一索引,只能建立全局唯一索引,所以如果普通表含有唯一索引时,可能会导致不能交换数据。
    • row_clause子语法用于设置分区表的行迁移开关。
      { ENABLE | DISABLE } ROW MOVEMENT
    • merge_clause子语法用于把多个分区合并成一个分区。当前只有RANGE分区支持合并分区。
      MERGE PARTITIONS { partition_name } [, ...] INTO PARTITION partition_name     [ TABLESPACE tablespacename ] [ UPDATE GLOBAL INDEX ]
    USTORE存储引擎表不支持在事务块中执行ALTER TABLE MERGE PARTITIONS的操作。
    • modify_clause子语法用于设置分区索引是否可用。
      MODIFY PARTITION partition_name { UNUSABLE LOCAL INDEXES | REBUILD UNUSABLE LOCAL INDEXES }
    • split_clause子语法用于把一个分区切割成多个分区。当前只有RANGE分区支持切割分区。
      SPLIT PARTITION { partition_name | FOR ( partition_value [, ...] ) } { split_point_clause | no_split_point_clause } [ UPDATE GLOBAL INDEX ]
      • 指定切割点split_point_clause的语法为。
        AT ( partition_value ) INTO ( PARTITION partition_name [ TABLESPACE tablespacename ] , PARTITION partition_name [ TABLESPACE tablespacename ] )
        • 列存分区表不支持切割分区。
        • 切割点的大小要位于正在被切割的分区的分区键范围内,指定切割点的方式只能把一个分区切割成两个新分区。
      • 不指定切割点no_split_point_clause的语法为。
        INTO { ( partition_less_than_item [, ...] ) | ( partition_start_end_item [, ...] ) }
        • 不指定切割点的方式,partition_less_than_item指定的第一个新分区的分区键要大于正在被切割的分区的前一个分区(如果存在的话)的分区键,partition_less_than_item指定的最后一个分区的分区键要等于正在被切割的分区的分区键大小。
        • 不指定切割点的方式,partition_start_end_item指定的第一个新分区的起始点(如果存在的话)必须等于正在被切割的分区的前一个分区(如果存在的话)的分区键,partition_start_end_item指定的最后一个分区的终止点(如果存在的话)必须等于正在被切割的分区的分区键。
        • partition_less_than_item支持的分区键个数最多为4,而partition_start_end_item仅支持1个分区键,其支持的数据类型参见PARTITION BY RANGE(parti...
        • 在同一语句中partition_less_than_item和partition_start_end_item两者不可同时使用;不同split语句之间没有限制。
      • 分区项partition_less_than_item的语法为。
        PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE }  [, ...] )     [ TABLESPACE tablespacename ]
      • 分区项partition_start_end_item的语法为,其约束参见START END语法描述
        PARTITION partition_name {        {START(partition_value) END (partition_value) EVERY (interval_value)} |        {START(partition_value) END ({partition_value | MAXVALUE})} |        {START(partition_value)} |        {END({partition_value | MAXVALUE})}} [TABLESPACE tablespace_name]
    • add_clause子语法用于为指定的分区表添加一个或多个分区。
      ADD PARTITION ( partition_col1_name = partition_col1_value [, partition_col2_name = partition_col2_value ] [, ...] )    [ LOCATION 'location1' ]    [ PARTITION (partition_colA_name = partition_colA_value [, partition_colB_name = partition_colB_value ] [, ...] ) ]    [ LOCATION 'location2' ]ADD {partition_less_than_item | partition_start_end_item| partition_list_item }
      分区项partition_list_item的语法如下。
      PARTITION partition_name VALUES (list_values_clause)     [ TABLESPACE tablespacename ]
      • partition_list_item仅支持1个分区键,其支持的数据类型参见PARTITION BY LIST(partit...
      • 间隔/哈希分区表不支持添加分区。
    • drop_clause子语法用于删除分区表中的指定分区。
      DROP PARTITION  { partition_name | FOR (  partition_value [, ...] )  } [ UPDATE GLOBAL INDEX ]
      • 哈希分区表不支持删除分区。
      • 当分区表只有一个分区时,不能删除该分区。
    • truncate_clause子语法用于清空分区表中的指定分区。
      TRUNCATE PARTITION  { partition_name | FOR (  partition_value [, ...] )  } [ UPDATE GLOBAL INDEX ]
  • 修改表分区名称的语法。
    ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name  )}    RENAME PARTITION { partion_name | FOR ( partition_value [, ...] ) } TO partition_new_name;
support.huaweicloud.com/centralized-devg-v2-opengauss/devg_03_0519.html