- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
遵循 this question 的建议,我正在使用 to_regclass
函数来检查表是否存在,如果不存在则创建它。但是,如果表是在当前事务中创建的,to_regclass
似乎仍会返回 null
。
这种行为是预期的吗?或者这是一个错误?
详情
这是一个错误的简短示例:
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;
最佳答案
您错误地使用了 %I
格式说明符。
如果您的类别是 1
,那么您最终会调用 to_regclass('test.test_1')
,即检查表 test_1
在模式 test
中。
但是,format('create table %I', 'test.test_1')
会将格式参数视为单个标识符并相应地引用它,评估为 'create table "测试.test_1"'
。这将在您的默认模式(可能是 public
)中创建一个名为 "test.test_1"
的表。
相反,您需要将架构名称和表名称视为单独的标识符。将表名定义为:
child_table_name = format('test.%I', 'test_' || new.category);
...并且在构建 SQL 字符串时,只需直接替换此值(即使用 %s
而不是 %I
)。
关于sql - PostgreSQL 事务性 DDL 和 to_regclass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39512091/
我已经动态创建了表名,我需要检查这个表是否存在,为此我这样做: .... SELECT to_regclass('public.tableprefix_'||variable_name) INTO t
遵循 this question 的建议,我正在使用 to_regclass 函数来检查表是否存在,如果不存在则创建它。但是,如果表是在当前事务中创建的,to_regclass 似乎仍会返回 null
我正在学习 Aqueduct(dart 的网络服务框架)教程(https://aqueduct.io/docs/tut/executing-queries/)然后当我尝试运行这个命令时 aqueduc
我是一名优秀的程序员,十分优秀!