PostgreSQL:如果 TABLE 存在评论
PostgreSQL: IF EXISTS COMMENT ON TABLE
如果存在任务,我有点卡住了。
我有几行查询使用 COMMENTS ON TABLE 函数
COMMENT ON TABLE my_table1 IS 'Comment for table1';
COMMENT ON TABLE my_table2 IS 'Comment for table2';
COMMENT ON TABLE my_table3 IS 'Comment for table3';
COMMENT ON TABLE my_table3 IS 'Comment for table4';
我想做的是,当我执行此查询时,如果 table 之一不存在,查询将通过该查询并继续。
我尝试使用 IF EXIST 操作完成该任务,但它不像 UPDATE 或其他操作那样工作。我哪里错了?
IF EXISTS (SELECT relname FROM pg_class where relname='my_table1')
then
COMMENT ON TABLE my_table1 IS 'Comment for table1';
IF EXISTS (SELECT relname FROM pg_class where relname='my_table2')
then
COMMENT ON TABLE my_table1 IS 'Comment for table2';
IF EXISTS (SELECT relname FROM pg_class where relname='my_table3')
then
COMMENT ON TABLE my_table1 IS 'Comment for table3';
IF EXISTS (SELECT relname FROM pg_class where relname='my_table4')
then
COMMENT ON TABLE my_table1 IS 'Comment for table4';
您可以使用:
DO
$do$
BEGIN
IF EXISTS (SELECT relname FROM pg_class where relname='my_table1') THEN
COMMENT ON TABLE my_table1 IS 'Comment for table1';
END IF;
IF EXISTS (SELECT relname FROM pg_class where relname='my_table2') THEN
COMMENT ON TABLE my_table1 IS 'Comment for table2';
END IF;
END
$do$
并检查:
SELECT relname, obj_description(oid)
FROM pg_class
WHERE relname LIKE 'my_table%';
COMMENT
command 目前 (Postgres 10) 没有 IF EXISTS
。您必须检查一种或另一种方式是否存在以避免异常 - 这会导致您的完整交易 ROLLBACK
。
因此,一种选择是 运行 分离交易并忽略任何错误:
BEGIN;
COMMENT ON TABLE my_table1 IS 'Comment for table1';
COMMIT;
BEGIN;
COMMENT ON TABLE my_table2 IS 'Comment for table2';
COMMIT;
-- etc.
或者你用IF
测试,比如.
或,你可以用to_regclass()
缩短代码,其中returns NULL表示不存在表。参见:
- How to check if a table exists in a given schema
DO
$do$
DECLARE
_tbls text[] :=
'{my_table1
, my_table2
, my_table3
, my_table4}';
_comments text[] :=
'{"Comment for table1"
, "Comment for table2"
, NULL
, "Comment for table4"}';
BEGIN
EXECUTE
(SELECT string_agg('COMMENT ON TABLE ' || to_regclass(t) || ' IS ' || quote_nullable(c), '; ')
FROM unnest(_tbls, _comments) t(t, c));
END
$do$;
您也可以通过这种方式删除任何评论(将其重置为 NULL)。另请注意 quote_nullable()
的使用。
检查:
SELECT t1 AS table, obj_description(t1) AS table_comment
FROM (SELECT to_regclass(t) AS t1
FROM unnest('{my_table1, my_table2, my_table3, my_table4}'::text[]) t) sub;
dbfiddle here
相关:
如果存在任务,我有点卡住了。
我有几行查询使用 COMMENTS ON TABLE 函数
COMMENT ON TABLE my_table1 IS 'Comment for table1';
COMMENT ON TABLE my_table2 IS 'Comment for table2';
COMMENT ON TABLE my_table3 IS 'Comment for table3';
COMMENT ON TABLE my_table3 IS 'Comment for table4';
我想做的是,当我执行此查询时,如果 table 之一不存在,查询将通过该查询并继续。
我尝试使用 IF EXIST 操作完成该任务,但它不像 UPDATE 或其他操作那样工作。我哪里错了?
IF EXISTS (SELECT relname FROM pg_class where relname='my_table1')
then
COMMENT ON TABLE my_table1 IS 'Comment for table1';
IF EXISTS (SELECT relname FROM pg_class where relname='my_table2')
then
COMMENT ON TABLE my_table1 IS 'Comment for table2';
IF EXISTS (SELECT relname FROM pg_class where relname='my_table3')
then
COMMENT ON TABLE my_table1 IS 'Comment for table3';
IF EXISTS (SELECT relname FROM pg_class where relname='my_table4')
then
COMMENT ON TABLE my_table1 IS 'Comment for table4';
您可以使用:
DO
$do$
BEGIN
IF EXISTS (SELECT relname FROM pg_class where relname='my_table1') THEN
COMMENT ON TABLE my_table1 IS 'Comment for table1';
END IF;
IF EXISTS (SELECT relname FROM pg_class where relname='my_table2') THEN
COMMENT ON TABLE my_table1 IS 'Comment for table2';
END IF;
END
$do$
并检查:
SELECT relname, obj_description(oid)
FROM pg_class
WHERE relname LIKE 'my_table%';
COMMENT
command 目前 (Postgres 10) 没有 IF EXISTS
。您必须检查一种或另一种方式是否存在以避免异常 - 这会导致您的完整交易 ROLLBACK
。
因此,一种选择是 运行 分离交易并忽略任何错误:
BEGIN;
COMMENT ON TABLE my_table1 IS 'Comment for table1';
COMMIT;
BEGIN;
COMMENT ON TABLE my_table2 IS 'Comment for table2';
COMMIT;
-- etc.
或者你用IF
测试,比如
或,你可以用to_regclass()
缩短代码,其中returns NULL表示不存在表。参见:
- How to check if a table exists in a given schema
DO
$do$
DECLARE
_tbls text[] :=
'{my_table1
, my_table2
, my_table3
, my_table4}';
_comments text[] :=
'{"Comment for table1"
, "Comment for table2"
, NULL
, "Comment for table4"}';
BEGIN
EXECUTE
(SELECT string_agg('COMMENT ON TABLE ' || to_regclass(t) || ' IS ' || quote_nullable(c), '; ')
FROM unnest(_tbls, _comments) t(t, c));
END
$do$;
您也可以通过这种方式删除任何评论(将其重置为 NULL)。另请注意 quote_nullable()
的使用。
检查:
SELECT t1 AS table, obj_description(t1) AS table_comment
FROM (SELECT to_regclass(t) AS t1
FROM unnest('{my_table1, my_table2, my_table3, my_table4}'::text[]) t) sub;
dbfiddle here
相关: