ALTER TABLE PARTITION

    注意事项

    • 添加分区的表空间不能是PG_GLOBAL。
    • 添加分区的名称不能与该分区表已有分区的名称相同。
    • 添加分区的分区键值要和分区表的分区键的类型一致,且要大于分区表中最后一个范围分区的上边界。
    • 如果目标分区表中已有分区数达到了最大值,则不能继续添加分区(范围分区表的分区数最大值是32767,哈希/列表分区表最大值是64)。

    • 当分区表只有一个分区时,不能删除该分区。

    • 选择分区使用PARTITION FOR(),括号里指定值个数应该与定义分区时使用的列个数相同,并且一一对应。
    • Value分区表不支持相应的Alter Partition操作。
    • 列存分区表不支持切割分区。
    • 间隔分区表不支持添加分区。
    • 哈希分区表不支持切割分区,不支持合成分区,不支持添加和删除分区。
    • 列表分区表不支持切割分区,不支持合成分区。
    • 只有分区表的所有者或者被授予了分区表ALTER权限的用户有权限执行ALTER TABLE PARTITION命令,系统管理员默认拥有此权限。
    • 修改表分区主语法。

      其中action统指如下分区维护子语法。当存在多个分区维护子句时,保证了分区的连续性,无论这些子句的排序如何,openGauss总会先执行DROP PARTITION再执行ADD PARTITION操作,最后顺序执行其它分区维护操作。

      1. exchange_clause |
      2. row_clause |
      3. merge_clause |
      4. modify_clause |
      5. split_clause |
      6. add_clause |
      7. drop_clause |
      8. truncate_clause
      • move_clause子语法用于移动分区到新的表空间。

        1. MOVE PARTITION { partion_name | FOR ( partition_value [, ...] ) } TABLESPACE tablespacename
      • exchange_clause子语法用于把普通表的数据迁移到指定的分区。

        1. EXCHANGE PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) }

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

        • 普通表和分区的列数目相同,对应列的信息严格一致,包括:列名、列的数据类型、列约束、列的Collation信息、列的存储参数、列的压缩信息等。
        • 普通表和分区的表压缩信息严格一致。
        • 普通表和分区的索引个数相同,且对应索引的信息严格一致。
        • 普通表和分区的表约束个数相同,且对应表约束的信息严格一致。
        • 普通表不可以是临时表,分区表只能是范围分区表、列表分区表、哈希分区表。
        • 普通表和分区表上不可以有动态数据脱敏,行访问控制约束。
        • 列表分区表,哈希分区表不能是列存储。
      • row_clause子语法用于设置分区表的行迁移开关。

        1. { ENABLE | DISABLE } ROW MOVEMENT
      • merge_clause子语法用于把多个分区合并成一个分区。

      • modify_clause子语法用于设置分区索引是否可用。

        1. MODIFY PARTITION partition_name { UNUSABLE LOCAL INDEXES | REBUILD UNUSABLE LOCAL INDEXES }
      • split_clause子语法用于把一个分区切割成多个分区。

        1. SPLIT PARTITION { partition_name | FOR ( partition_value [, ...] ) } { split_point_clause | no_split_point_clause } [ UPDATE GLOBAL INDEX ]
        • 指定切割点split_point_clause的语法为。

          1. AT ( partition_value ) INTO ( PARTITION partition_name [ TABLESPACE tablespacename ] , PARTITION partition_name [ TABLESPACE tablespacename ] )

          须知:

          • 列存分区表不支持切割分区。

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

        • 不指定切割点no_split_point_clause的语法为。

          1. INTO { ( partition_less_than_item [, ...] ) | ( partition_start_end_item [, ...] ) }
        • 分区项partition_start_end_item的语法为,其约束参见。

          1. PARTITION partition_name {
          2. {START(partition_value) END (partition_value) EVERY (interval_value)} |
          3. {START(partition_value) END ({partition_value | MAXVALUE})} |
          4. {START(partition_value)} |
      • add_clause子语法用于为指定的分区表添加一个或多个分区。

        1. ADD PARTITION ( partition_col1_name = partition_col1_value [, partition_col2_name = partition_col2_value ] [, ...] )
        2. [ LOCATION 'location1' ]
        3. [ PARTITION (partition_colA_name = partition_colA_value [, partition_colB_name = partition_colB_value ] [, ...] ) ]
        4. [ LOCATION 'location2' ]
        5. ADD {partition_less_than_item | partition_start_end_item| partition_list_item }

        分区项partition_list_item的语法如下。

        1. PARTITION partition_name VALUES (list_values_clause)
        2. [ TABLESPACE tablespacename ]

        ALTER TABLE PARTITION - 图4 须知:

        • partition_list_item仅支持的1个分区键,其支持的数据类型参见PARTITION BY LIST(partit…

        • 间隔/哈希分区表不支持添加分区。

      • drop_clause子语法用于删除分区表中的指定分区。

        1. DROP PARTITION { partition_name | FOR ( partition_value [, ...] ) } [ UPDATE GLOBAL INDEX ]
      • truncate_clause子语法用于清空分区表中的指定分区。

    • 修改表分区名称的语法。

      1. ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )}

    参数说明

    • table_name

      分区表名。

      取值范围:已存在的分区表名。

    • partition_name

      分区名。

      取值范围:已存在的分区名。

    • tablespacename

      指定分区要移动到哪个表空间。

      取值范围:已存在的表空间名。

    • partition_value

      分区键值。

      通过PARTITION FOR ( partition_value [, …] )子句指定的这一组值,可以唯一确定一个分区。

    • UNUSABLE LOCAL INDEXES

      设置该分区上的所有索引不可用。

    • REBUILD UNUSABLE LOCAL INDEXES

      重建该分区上的所有索引。

    • ENABLE/DISABLE ROW MOVEMET

      行迁移开关。

      如果进行UPDATE操作时,更新了元组在分区键上的值,造成了该元组所在分区发生变化,就会根据该开关给出报错信息,或者进行元组在分区间的转移。

      取值范围:

      • ENABLE:打开行迁移开关。
      • DISABLE:关闭行迁移开关。

      默认是打开状态。

    • ordinary_table_name

      进行迁移的普通表的名称。

      取值范围:已存在的普通表名。

    • { WITH | WITHOUT } VALIDATION

      在进行数据迁移时,是否检查普通表中的数据满足指定分区的分区键范围。

      取值范围:

      • WITH:对于普通表中的数据要检查是否满足分区的分区键范围,如果有数据不满足,则报错。
      • WITHOUT:对于普通表中的数据不检查是否满足分区的分区键范围。

      默认是WITH状态。

      由于检查比较耗时,特别是当数据量很大的情况下更甚。所以在保证当前普通表中的数据满足分区的分区键范围时,可以加上WITHOUT来指明不进行检查。

    • VERBOSE

      在VALIDATION是WITH状态时,如果检查出普通表有不满足要交换分区的分区键范围的数据,那么把这些数据插入到正确的分区,如果路由不到任何分区,再报错。

      须知: 只有在VALIDATION是WITH状态时,才可以指定VERBOSE。

    • partition_new_name

      分区的新名称。

      取值范围:字符串,要符合标识符的命名规范。

    请参考CREATE TABLE PARTITION的。

    相关链接