MODIFY 子句

使用 MODIFY 子句更改表或索引的分片列表中现有分区上的现有分片表达式,或定义、修改或禁用范围区间或滚动窗口分片结构。

使用 MODIFY 子句更改表或索引的现有分片列表。您可以使用此子句完成以下一个或多个任务:
  • 将现有的分片从一个 dbspace 移动到另一个不同的 dbspace 中
  • 更改与现有基于列表或基于表达式分片相关的表达式
  • 更改在范围区间分片列表中定义过渡分片的表达式
  • 重命名一个或多个现有的分片
  • 启用或禁用区间分片的自动创建方式
  • 替换 dbspace 的列表或指定存储新区间分片的函数
  • 将一个滚动窗口列表更改为按区间分片的表(没有清除策略)
  • 将按范围区间分片的表更改为滚动窗口列表C
  • 按一下一个或多个操作来更改滚动窗口列表的清除策略:
    • 重新设置区间分片的数量的限制
    • 更改对表的已分配的存储大小的限制
    • 替换 ATTACH or DISCARD 关键字选项
    • 替换 ANYINTERVAL FIRSTINTERVAL ONLY 关键字选项
ALTER FRAGMENT 语句的 MODIFY 子句具有以下语法:
MODIFY 子句
分片表达式
元素 描述 限制 语法
const_expr 定义要分片要存储的列值或此范围区间分片的新的上限值的常量表达式 必须是带引号的字符串或文本值。对于按列表分片,对于同一对象的分片的表达式列表,每个值必须唯一。 常量表达式
dbspace 存储 new 分片的 Dbspace 在执行时必须存在。所有的 dbspace 必须有相同的页大小。 标识符
dbspace _fun 返回 dbspace 名称的 UDF 名称 当数据库服务器调用 URD 为新的分片分配存储时,用户定义函数和返回的 dbspace 必须存在。 CREATE FUNCTION 语句
expression 已修改的表达式 仅可以指定当前表中的列,以及单独一行中的数据。 条件; 表达式
new_dbspace 存储系统生成的范围区间分片的 Dbspace 在执行时必须存在。所有的 dbspace 必须有相同的页大小。 标识符
new 您在此处为已修改的分片声明的 名称 在分片列表中分片名称必须唯一。 如果表和它的索引使用相同的范围区间或表分片存储策略,那么每个索引分片必须具有同对应表分片相同的名称。 标识符
old 现有分片的名称 在分片表中必须存在。对于列表或范围区间分片,PARTITION 关键字必须在此名称之前。 标识符
range _expr 范围表达式。定义存储在分片中的分片键的上限。 必须是恒定文字表达式,其与分片键表达式的数据类型兼容的数字、DATETIME 或 DATE 数据类型。另见范围区间分片的 MODIFY 子句的限制 常量表达式

用法

如果不更改存储位置,那么此处的 dbspaceold(或 oldnew )可以是相同的。对于按范围区间分片的表或索引,dbspace 指定的列表遵循 STORE IN 关键字替换在声明 ALTER FRAGMENT . . . MODIFY 语句之前的 dbspace 列表。之前 dbspace 列表中的分片不会被此选项重置。

STORE IN 子句可以选择指定返回现有 dbspace 名称的用户定义函数,而不是文字 dbspace 标识列表。此 UDF 声明的标识为随意的。有关此 UDF 及如何创建它的示例的更多信息,请参阅在 CREATE TABLE 主题 Interval fragment 子句 中 STORE IN 子句的讨论。

要使用 MODIFY 子句更改 expression 和移动它的对应分片到新的存储位置时,您必须更改 expression 并且必须指定不同于 dbspace 或分区的名称。

如果同一表或索引的多个分片与 dbspace 名称相同,那么就必须声明 new 分片的名称。在范围区间分片的 new 分片之前必须使用 PARTITION 关键字(但是它对循环分片和基于表达式的分片是可选的)。

expression 必须求出一个 Boolean 值(true 或 false)。

expression 中不允许任何子查询或聚集。此外内置的 CURRENTDATEDBINFOSYSDATETODAY 表达式是无效的。

当您使用 MODIFY 子句更改表达式而不变更此表达式的存储位置时,您必须使用与 old 分片的和 new 的分片的名称相同。然而,如果 dbspace 只由一个单独的分区组成,您可指定参考以下示例为 olddbspace 指定名称:
ALTER FRAGMENT ON TABLE cust_acct 
          MODIFY dbsp1 TO acct_num < 65 IN dbsp1;

对于分片列表策略,如果新的列表表达式与同一表中或索引中的其他分片的现有列表表达式重叠,那么 ALTER FRAGMENT MODIFY 失败并发送错误。

当您使用 MODIFY 子句将一个 dbspace 移动到另一个 dbspace 中时,old 是分片以前位置的 dbspace 的名称,dbspace 是该分片的新位置。如下所示:
ALTER FRAGMENT ON TABLE cust_acct
          MODIFY PARTITION part1 TO PARTITION part2 (acct_num < 35) IN dbsp2;

以上修改了 cust_acct 表的分布方案的 ALTER FRAGMENT语句 ,这样 acct_num 列中小于 35 的所有行项 (先前被分配到分片 part1 的存储在 dbspace dbsp1中)将会分配到存储在 dbspace dbsp2 中的分片 part2

当您使用 MODIFY 子句时,底层的 dbspace 不会受到影响。仅会影响到这些分片或 dbspace 中的数据。

如果已经存在非余项分片,除非此分片策略是范围区间策略,您才能重新定义一个非余项分片为余项分片(其他分片的不符合分片键值的行)。然而,如果 REMAINDER 分片中的记录不满足新的 expression,则您无法将该 REMAINDER 分片更改为一个非余项分片。

attached 索引与它的表具有相同的存储分布。如果表上所有的索引是连接的索引,并且您使用 MODIFY 子句修改此表分片,那么数据库服务器会自动修改此索引的存储分布策略以适应新的表分片策略。

old 规范无引用按范围分区存储分布方案分片的表的过渡分片(最后一个范围分片)。该分片唯一有效的修改是使用 TRANSITION TO const_expr 子句增加此过渡值。有关其它直接尝试重新定义此过渡分片范围表达式的语法,数据库服务器返回错误。 有关更多信息,请参阅主题使用 MODIFY INTERVAL TRANSITION 选项

1 仅范围区间分片
2 最多使用一次此路径
3 对范围区间分片不可用
4 仅于列表分片
5 请参阅 Rolling Window 子句