更改表以在 postgres 中添加“按范围分区”

Jag*_*esh 9 postgresql

我想通过使用archivedate按范围添加分区来更改表。

CREATE TABLE transactions(
    id              UUID         not null ,
    txn_id          UUID         NOT NULL,
    orderId         UUID         NOT NULL,
    inserttstmp     timestamp    not NULL
    archivedate     timestamp    NULL
)
Run Code Online (Sandbox Code Playgroud)

通常,每当我使用以下脚本创建带有分区的新表时。但现在想对现有表做同样的事情。

CREATE TABLE attachment(
    id              UUID            not null,
    txn_id          UUID         NOT NULL,
    attachment_id   UUID         NOT NULL,
    inserttstmp     timestamp    not NULL
    archivedate     timestamp    NULL
)PARTITION BY RANGE (archivedate);

CREATE TABLE ins_txn_attachment_live PARTITION OF ins_txn_attachment DEFAULT;
ALTER  TABLE ins_txn_attachment_live ADD CHECK (archivedate is null);
ALTER  TABLE ins_txn_attachment_live ADD CONSTRAINT PK_INS_TXN_ATTACHMENT_EVENT_Live unique (id);

CREATE UNIQUE NONCLUSTERED INDEX PK_Ins_TXN_Attachment_ID_ArchiveData ON ins_txn_attachment (id,archivedate);
Run Code Online (Sandbox Code Playgroud)

谢谢,贾加迪什

Sta*_*eas 0

从查询中,我相信您想在现有表上更改或添加分区列,在本例中为ins_txn_attachment_live。当没有选项可以更改表的特定属性(例如分区或更改表内字段的位置)时,我看到并且我个人遵循的一种简单方法如下:

首先重命名您的表并包括键或索引(此外,不要在 PostgreSQL 索引中给出 PK 前缀,因为 PostgreSQL 创建开箱即用的主键索引,但在 PGAdmin 中不可见):

ALTER TABLE ins_txn_attachment_live RENAME TO ins_txn_attachment_live_old
ALTER INDEX PK_Ins_TXN_Attachment_ID_ArchiveDataRENAME TO PK_Ins_TXN_Attachment_ID_ArchiveData_old
Run Code Online (Sandbox Code Playgroud)

然后使用所需的分区创建新表:

CREATE TABLE ins_txn_attachment_live (
    id              UUID         NOT NULL,
    attachment_id   UUID         NOT NULL,
    inserttstmp     timestamp    not NULL
    archivedate     timestamp    NULL
)PARTITION BY RANGE (<whatever column>);
Run Code Online (Sandbox Code Playgroud)

然后将数据从 _old 表复制到新表(如果源列和目标列相同):

INSERT INTO ins_txn_attachment_live SELECT * FROM ins_txn_attachment_live_old
Run Code Online (Sandbox Code Playgroud)

然后将数据从 _old 表复制到新表(如果源列和目标列不同):

INSERT INTO ins_txn_attachment_live (id, attachment_id, inserttstmp, archivedate, new_column) SELECT id, attachment_id, inserttstmp, archivedate, 'new_default_value' FROM ins_txn_attachment_live_old
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你