当前位置:   article > 正文

postgres分区表修改分区规则_分区表字符型怎么指定范围 postgres

分区表字符型怎么指定范围 postgres

需求描述:如按列表分区,有一个分区表里存放的是 l_type in ('1'),现在想把这个分区改为t_type in ('1', '3')
postgres好像没有直接提供这样的方法,需要间接地进行一下修改,这里会用到 ATTACH PARTITIONDETACH PARTITION

为了演示,准备工作就是把数据建出来
创建父表

create table list_partition_test(id serial, l_type char(1)) partition by list( l_type );
  • 1

创建子表

create table list_partition_test_1 partition of list_partition_test for values in ('1');
create table list_partition_test_2 partition of list_partition_test for values in ('2');
  • 1
  • 2

随意地添加数据,注意这里没有添加默认分区,也就是说不能太随意,如果添加l_type=3的记录是添加不进去的。

insert into list_partition_test (l_type) values ('1');
insert into list_partition_test (l_type) values ('2');
insert into list_partition_test (l_type) values ('2');
insert into list_partition_test (l_type) values ('2');
insert into list_partition_test (l_type) values ('1');
  • 1
  • 2
  • 3
  • 4
  • 5

查一下数据吧

# 全表
select * from list_partition_test;
 id | l_type
----+--------
  1 | 1
  5 | 1
  2 | 2
  3 | 2
  4 | 2
(5 rows)
# 分区1
select * from list_partition_test_1;
 id | l_type
----+--------
  1 | 1
  5 | 1
(2 rows)
# 分区2
select * from list_partition_test_2;
 id | l_type
----+--------
  2 | 2
  3 | 2
  4 | 2
(3 rows)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

现在想让分区1也能插入l_type=3的记录,需要这么做一下。
先看一下添加l_type=3会怎么样吧

insert into list_partition_test (l_type) values ('3');
ERROR:  no partition of relation "list_partition_test" found for row
DETAIL:  Partition key of the failing row contains (l_type) = (3).
  • 1
  • 2
  • 3

人家没让添加成功
下面让它能添加成功
先将分区1从父表移除 – DETACH

ALTER TABLE list_partition_test DETACH PARTITION list_partition_test_1;

# 查一下数据
select * from list_partition_test;
 id | l_type
----+--------
  2 | 2
  3 | 2
  4 | 2
(3 rows)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

再查数据时发现分区1的数据没了,当然会这样,因为数据就在人家分区1里,又不在list_partition_test里。不过不要慌,它又没丢。
这个时候把分区1再添加进来

ALTER TABLE list_partition_test ATTACH PARTITION list_partition_test_1  FOR VALUES IN ('1', '3');

# 再查一下数据
select * from list_partition_test;
 id | l_type
----+--------
  1 | 1
  5 | 1
  2 | 2
  3 | 2
  4 | 2
(5 rows)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

再查数据时,发现数据已经回来了。就说不要慌的。
但是这里注意,添加分区1时,要保证list_partition_test_1表里的数据l_type都是1或3,要是再有个l_type=4,就ATTACH不成功了。
下面试一下效果,添加一条l_type=3的数据。

insert into list_partition_test (l_type) values ('3');

# 查一下数据再,可以发现l_type=3的数据已经插入成功了
select * from list_partition_test;
 id | l_type
----+--------
  1 | 1
  5 | 1
  7 | 3
  2 | 2
  3 | 2
  4 | 2
(6 rows)

# 而且l_type=3的数据在分区1里
select * from list_partition_test_1;
 id | l_type
----+--------
  1 | 1
  5 | 1
  7 | 3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

OKAY,搞完了。

生产环境数据量通常会很大,也可以采用这样的方法,但要小心慢来。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/755184
推荐阅读
相关标签
  

闽ICP备14008679号