如何用 child tables 重命名分区 table

How to rename a partitions table with child tables

我正在尝试重命名分区中的 parent table。我以明智的方式创建了 3 child tables。我可以更改 parent table 的名称,但我不知道如何更改 3 child table 引用。

这是我的分区结构tables。

CREATE TABLE IF NOT EXISTS test_demos(
id bigserial NOT NULL,  
partition_by integer NOT NULL,
names character varying (80) NOT NULL,
age integer,
aed character varying (5) NOT NULL,
entered_user_id integer,
entered_post_id integer,
entered_office_id integer,
dept_code character varying (25) NOT NULL,
owner_dept_code character varying (25) NOT NULL,
approval character varying (5) NOT NULL,
which inet,
whom macaddr,
who character varying(50),
row_created_at timestamp(0) WITHOUT TIME ZONE NOT NULL DEFAULT 
CURRENT_TIMESTAMP)
PARTITION BY LIST(partition_by);

CREATE TABLE IF NOT EXISTS test_demos2019s PARTITION OF test_demos FOR VALUES IN (2019);

CREATE TABLE IF NOT EXISTS test_demos2020s PARTITION OF test_demos FOR VALUES IN (2020);

CREATE TABLE IF NOT EXISTS test_demos2021s PARTITION OF test_demos FOR VALUES IN (2021);

更改 table 名称的语法是,

alter table table_name to new_table_name;

你的情况是:

alter table test_demos2019s to new_table_name;
alter table test_demos2020s to new_table_name;
alter table test_demos2021s to new_table_name;

在 PostgreSQL 中,这在我看来是这样的。

ALTER TABLE test_demos2019s RENAME TO new_table_name;
ALTER TABLE test_demos2020s RENAME TO new_table_name2;
ALTER TABLE test_demos2021s RENAME TO new_table_name3;

一般来说,您可以创建一个函数,它可以使用某种模式重命名所有子分区

create or replace function rename_partitions()
    returns void as
$BODY$
declare 
    table_rec record;
begin
    for table_rec in
        select 
            inhrelid::regclass::text as c_tbl_name, 
            -- you can use any postgres function to generate new names for child tables
            split_part(inhrelid::regclass::text, '_', 2) as new_tbl_name
                         from   pg_catalog.pg_inherits
                         where  inhparent = 'test_demos'::regclass
    loop
        EXECUTE format($$alter table %I rename to %I$$, 
                   table_rec.c_tbl_name, table_rec.new_tbl_name);
    end loop;
END;
$BODY$
  LANGUAGE plpgsql;

当然,你可以给这个函数加参数,让它更通用。

可在此处获取更多信息: