将分区LIST附加到postgres 11中的现有表

时间:2019-07-15 11:48:34

标签: postgresql database-partitioning

我正在尝试更改表以在postgres 11中使用分区LIST。我已经尝试了几个小时,但是我一直遇到错误。

我有一个巨大的表,客户,有(client_id,customer_id,值)。

我已经通过将旧表重命名为clients_old来创建一个新的空表,即client,然后使用CREATE TABLE clients( like clients_old including all)创建了新表。

从这里开始,当我尝试添加LIST分区时,我陷入了困境。

我试图:

ALTER TABLE Clients attach PARTITION BY LIST  (client_id) --> fail;
ALTER TABLE Clients attach PARTITION  LIST  (client_id) --> fail;
ALTER TABLE Clients ADD PARTITION  LIST  (client_id) --> fail;

我应该使用哪种语法来更改表以使用分区?

2 个答案:

答案 0 :(得分:1)

Quote from the manual

  

不可能将常规表转换为分区表,反之亦然

因此,您不能将现有的非分区表更改为分区表。

您需要创建一个已分区的新表(使用不同的名称),创建所有必要的分区,然后将数据从旧表复制到新的分区表中。

类似:

create table clients_partitioned
(
  .... all columns ...
)
PARTITION BY LIST  (client_id);

然后创建分区:

create table clients_1 
   partition of clients_partioned
   values in (1,2,3);

create table clients_1 
   partition of clients_partioned
   values in (4,5,6);

复制数据:

insert into clients_partitioned
select *
from clients;

完成后,您可以删除旧表并重命名新表:

drop table clients;
alter table clients_partitioned rename to clients;

别忘了重新创建外键和索引。

答案 1 :(得分:-1)

我必须添加for标签才能添加分区:

create table clients_1 
partition of clients_partioned
for values in (4,5,6);

因为没有for是语法错误。