金仓数据库KingbaseES 分区表UPDATE介绍
关键字:
KingbaseES、分区表、UPDATE、跨分区、分区键、人大金仓、KingbaseES
分区表介绍
分区表是在一个节点内部对数据按照用户指定策略做进一步的水平分区,将表中数据按照指定方式划分为多个互不重叠的部分。
在KingbaseES数据库可以使用SQL语句操纵分区中的数据进行增删改查。需要注意的是当对表中数据进行修改导致违背分区约束(建立分区表时分区限制条件)时,可能导致报错。本文主要介绍分区表的update操作,并使用例子展示什么时候分区表会拒绝执行update。
Update分区表
KingbaseES数据库的update语法如下所示,可以使用part_extension_clause子句指定要执行update的分区。
[ WITH [ RECURSIVE ] with_query [, ...] ] UPDATE [ ONLY ] table_name [part_extension_clause] [ * ] [ [ AS ] alias ] | sub_query [alias] SET {[{ column_name = { expression | DEFAULT } | ( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) | ( column_name [, ...] ) = ( sub-SELECT ) } [, ...]] | [ ROW = record]} [ FROM from_list ] [ WHERE condition | WHERE CURRENT OF cursor_name ] [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ] |
Part_extension_clause: { PARTITION (patition) | PARTITION FOR (partition_key_value [, partition_key_value]…) | SUBPARTITION (subpartition) | SUBPARTITION FOR (subpartition_key_value [, subpartition_key_value]…) } |
在KingbaseES数据库中用户要对某个分区进行增删改查操作时也可以不使用part_extension_clause子句。KingbaseES每一个分区都对应一个表名,对应关系为如下:
分区的表名=分区表名+‘_’+分区名
例如,当我们建立了一个拥有分区part1和part2的分区表partTab时,part1分区对应的表名称为partTab_part1, part2分区对应表的名称为partTab_part2。
测试用例
- 建立分区表
create table t5 ( order_id number(7) primary key, order_date date, info1 varchar(10), info2 varchar(10) ) partition by range(order_date) subpartition by List(info1) ( partition P2020 values less than (to_date('01-01-2021','dd-mm-yyyy')) ( SUBPARTITION XD values('XD'), SUBPARTITION YD values('YD') ), partition P2021 values less than (to_date('01-01-2022','dd-mm-yyyy')) ( SUBPARTITION ZD values('ZD'), SUBPARTITION MD values('MD') ) ); \d+ t5 --使用\d+命令只能看到分区,无法看到子分区,查看子分区可以使用\d+ 分区名 \d+ t5_p2020 --往分区表中插入数据 insert into t5 values(1,to_date('05-03-2020','dd-mm-yyyy'),'XD','p1_1'); insert into t5 values(2,to_date('04-01-2020','dd-mm-yyyy'),'YD','p1_2'); insert into t5 values(3,to_date('06-06-2021','dd-mm-yyyy'),'ZD','p2_1'); insert into t5 values(4,to_date('07-05-2021','dd-mm-yyyy'),'MD','p2_2'); |
- 使用表名update
--update非分区键,正常执行 update t5 set info2='update' where order_id=4; --update分区键,不违背分区约束 update t5 set order_date=to_date('05-05-2021','dd-mm-yyyy') where order_id=4; --update分区键,违背分区约束,转移到另一个分区 update t5 set order_date=to_date('05-05-2020','dd-mm-yyyy'), info1='XD' where order_id=4; --可以看到update的行已经移动到了P2020分区内 --update到一个不存在的分区将失败,(p2021不存在info值为XD的子分区) update t5 set order_date=to_date('05-05-2021','dd-mm-yyyy'), info1='XD' where order_id=4; |
- 使用分区名update
--update不违背分区约束,使用分区名update将只更新分区内的数据 update t5 partition(P2020) set order_date=to_date('05-12-2020','dd-mm-yyyy'), info1='XD' ; --update违背分区约束,正常执行 update t5 partition(P2020) set order_date=to_date('05-12-2021','dd-mm-yyyy'), info1='MD' where order_id=4; --update到一个不存在的分区 update t5 partition(P2021) set order_date=to_date('05-12-2020','dd-mm-yyyy') where order_id=4; |
- 使用分区对应的表名update
--update不违背分区约束 update t5_p2021 set order_date=to_date('11-12-2021','dd-mm-yyyy') where order_id=4; --update违背分区约束,将失败 update t5_p2021 set order_date=to_date('05-12-2020','dd-mm-yyyy'), info1='XD' where order_id=4; --update 使用分区名组合分区对应表名(使用分区对应表名的update,分区名将是子分区名) update t5_p2021 partition(MD) set info2='p2_2'; |
总结
在KingbaseES中对分区表进行update操作可以使用分区名或分区对应的表名更新某一个分区。需要注意的是分区表不允许更新到一个不存在的分区;不允许使用分区对应表名时违背分区约束;分区对应表名和分区名组合使用时,分区名将是子分区名。