我想通过使用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)
谢谢,贾加迪什
从查询中,我相信您想在现有表上更改或添加分区列,在本例中为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)
希望能帮助到你
| 归档时间: |
|
| 查看次数: |
11132 次 |
| 最近记录: |