this questionの提案に続いて、私はto_regclass
関数を使用して、テーブルが存在するかどうかをチェックし、存在しない場合はテーブルを作成しています。ただし、テーブルが現在のトランザクションで作成された場合、to_regclass
はまだnull
を返します。PostgreSQLのトランザクションDDLとto_regclass
この現象は予期されていますか?それともバグですか?あなたは間違って%I
書式指定子を使用している
begin;
create schema test;
create table test.test (id serial, category integer);
create or replace function test.test_insert() returns trigger as $$
declare
child_table_name text;
table_id text;
begin
child_table_name = concat('test.test_', text(new.category));
table_id = to_regclass(child_table_name::cstring);
if table_id is null then
execute format('create table %I (primary key (id), check (category = %L)) inherits (test.test)', child_table_name, new.category);
end if;
execute format ('insert into %I values ($1.*)', child_table_name) using new;
return null;
end;
$$ language plpgsql;
create trigger test_insert before insert on test.test for each row execute procedure test.test_insert();
insert into test.test (category) values (1);
insert into test.test (category) values (1);
insert into test.test (category) values (1);
commit;
なぜ、 'create table if not exist'を使うのですか? –
ああ...はい、あなたは私をそこに連れてきました。 – Tom