如何用 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;
当然,你可以给这个函数加参数,让它更通用。
可在此处获取更多信息:
我正在尝试重命名分区中的 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;
当然,你可以给这个函数加参数,让它更通用。
可在此处获取更多信息: