云数据库 GAUSSDB-ALTER TABLE SUBPARTITION:语法格式

时间:2023-11-16 09:08:33

语法格式

修改二级分区表分区包括修改表分区主语法、修改表分区名称的语法和重置分区ID的语法。

  • 修改表分区主语法。
    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  |
        add_clause    |
        drop_clause   |    
        split_clause  |
        truncate_clause
    • move_clause子语法用于移动分区到新的表空间。
      MOVE SUBPARTITION { subpartion_name | FOR ( subpartition_value [, ...] ) } TABLESPACE tablespacename
    • exchange_clause子语法用于把普通表的数据迁移到指定的分区。
      EXCHANGE SUBPARTITION { ( subpartition_name ) | FOR ( subpartition_value [, ...] ) } 
          WITH TABLE {[ ONLY ] ordinary_table_name | ordinary_table_name * | ONLY ( ordinary_table_name )} 
          [ { WITH | WITHOUT } VALIDATION ] [ VERBOSE ] [ UPDATE GLOBAL INDEX ]

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

      • 普通表和分区的列数目相同,对应列的信息严格一致,包括:列名、列的数据类型、列约束、列的Collation信息、列的存储参数、列的压缩信息等。
      • 普通表和分区的表压缩信息严格一致。
      • 普通表索引和分区Local索引个数相同,且对应索引的信息严格一致。
      • 普通表和分区的表约束个数相同,且对应表约束的信息严格一致。
      • 普通表不可以是临时表,分区表只能是二级分区表。
      • 普通表和分区表上不可以有动态数据脱敏,行访问控制约束。
      • 完成交换后,普通表和分区的数据被置换,同时普通表和分区的表空间信息被置换。此时,普通表和分区的统计信息变得不可靠,需要对普通表和分区重新执行analyze。
      • 由于非分区键不能建立本地唯一索引,只能建立全局唯一索引,所以如果普通表含有唯一索引时,可能会导致不能交换数据。

        如果需要进行数交换数据操作可以通过创建中间表的方式,先将分区数据插入到中间表,truncate分区,普通表数据插入分区表,drop普通表,重命名中间表的方式完成数据交换操作。

      • 如果在普通表/分区表上进行了drop column操作,被删除的列依然物理存在,所以需要保证普通表和分区的被删除列也严格对齐才能交换成功。
    • row_clause子语法用于设置分区表的行迁移开关。
      { ENABLE | DISABLE } ROW MOVEMENT
    • merge_clause子语法用于把多个分区合并成一个分区。一个命令中合并的源分区上限为300。
      MERGE SUBPARTITIONS { subpartition_name } [, ...] INTO SUBPARTITION partition_name 
          [ TABLESPACE tablespacename ] [ UPDATE GLOBAL INDEX ]

      对于范围分区,MERGE分区要求源分区的范围连续递增,且MERGE后的分区名可以与最后一个源分区名相同;对于列表分区,则源分区无顺序要求,且MERGE后的分区名可以与任一源分区名相同。如果MERGE后的分区名与源分区名相同,视为同一个分区。

      USTORE存储引擎表不支持在事务块/存储过程中执行ALTER TABLE MERGE SUBPARTITIONS的操作。

    • modify_clause子语法用于设置分区索引是否可用。语法可以作用在一级分区上。
      MODIFY PARTITION partition_name { UNUSABLE LOCAL INDEXES | REBUILD UNUSABLE LOCAL INDEXES }

      也可以作用在二级分区上。

      MODIFY SUBPARTITION partition_name { UNUSABLE LOCAL INDEXES | REBUILD UNUSABLE LOCAL INDEXES }
    • add_clause子语法用于为指定的分区表添加一个或多个分区。语法可以作用在一级分区上。
      ADD {partition_less_than_item | partition_list_item } [ ( subpartition_definition_list ) ]

      也可以作用在二级分区上。

      MODIFY PARTITION partition_name ADD subpartition_definition

      其中,分区项partition_less_than_item为RANGE分区定义语法,具体语法如下。

      PARTITION partition_name VALUES LESS THAN ( partition_value | MAXVALUE ) [ TABLESPACE tablespacename ]
      分区项partition_list_item为LIST分区定义语法,具体语法如下。
      PARTITION partition_name VALUES ( partition_value [, ...] | DEFAULT ) [ TABLESPACE tablespacename ]

      subpartition_definition_list为1到多个二级分区subpartition_definition对象,subpartition_definition具体语法如下。

      SUBPARTITION subpartition_name [ VALUES LESS THAN ( partition_value | MAXVALUE ) | VALUES ( partition_value [, ...] | DEFAULT )]  [ TABLESPACE tablespace ]

      若一级分区为HASH分区,不支持以ADD形式新增一级分区;若二级分区为HASH分区,不支持以MODIFY形式新增二级分区。

    • drop_clause子语法用于删除分区表中的指定分区。语法可以作用在一级分区上。
      DROP PARTITION  { partition_name | FOR (  partition_value )  } [ UPDATE GLOBAL INDEX ]

      也可以作用在二级分区上。

      DROP SUBPARTITION  { subpartition_name | FOR (  partition_value, subpartition_value )  } [ UPDATE GLOBAL INDEX ]
      • 若一级分区为HASH分区,不支持删除一级分区;若二级分区为HASH分区,不支持删除二级分区。
      • 不支持删除唯一子分区。
    • split_clause子语法用于把一个分区切割成多个分区。
      SPLIT SUBPARTITION { subpartition_name| FOR ( subpartition_value [, ...] ) } { split_point_clause | no_split_point_clause } [ UPDATE GLOBAL INDEX ]
      • SPLIT后的分区名可以与源分区名相同,但视为不同的分区。
      • 列存分区表不支持切割分区。
      • 范围分区指定切割点split_point_clause的语法为:
        AT ( subpartition_value ) INTO ( SUBPARTITION subpartition_name [ TABLESPACE tablespacename ] , SUBPARTITION subpartition_name [ TABLESPACE tablespacename ] )

        切割点的大小要位于正在被切割的分区的分区键范围内,指定切割点的方式只能把一个分区切割成两个新分区。

      • 范围分区不指定切割点no_split_point_clause 的语法如下,其中最后一个分区不能写分区范围定义,即VALUES LESS THAN (subpartition_value)部分,默认继承源分区范围定义的上界值。
        INTO ( SUBPARTITION subpartition_name VALUES LESS THAN (subpartition_value) [ TABLESPACE tablespacename ][, ...] )
        • 第一个新分区的分区范围定义要大于正在被切割的分区的前一个分区(如果存在的话)的分区范围定义。
        • 最后一个新分区不能写分区范围定义,默认继承源分区范围定义的上界值。
        • 新分区必须满足分区范围定义递增的约束。
      • 列表范围分区指定切割点split_point_clause的语法如下:
        VALUES ( subpartition_value ) INTO ( SUBPARTITION subpartition_name [ TABLESPACE tablespacename ] , SUBPARTITION subpartition_name [ TABLESPACE tablespacename ] )

        切割点必须是源分区的一个非空真子集,指定切割点的方式只能把一个分区切割成两个新分区。

      • 列表分区表不指定切割点no_split_point_clause的语法如下,其中最后一个分区不能写分区范围定义,即VALUES (subpartition_value_list)部分,其范围等于源分区去掉其他子分区后的剩余集合。
        INTO ( SUBPARTITION subpartition_name VALUES (subpartition_value_list) [ TABLESPACE tablespacename ][, ...] )
        • 最后一个新分区不能写分区范围定义,其范围等于源分区去掉其他子分区后的剩余集合。
        • 不指定切割点的方式,每一个新分区都必须是源分区的一个非空真子集,且互不交叉。
    • truncate_clause子语法用于清空分区表中的指定分区。语法可以作用在一级分区上。
      TRUNCATE PARTITION  { partition_name | FOR (  partition_value [, ...] )  } [ UPDATE GLOBAL INDEX ]

      也可以作用在二级分区上。

      TRUNCATE SUBPARTITION  { subpartition_name | FOR (  subpartition_value [, ...] )  } [ UPDATE GLOBAL INDEX ]
support.huaweicloud.com/centralized-devg-v3-gaussdb/gaussdb-12-0503.html