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%';

DBFiddle Demo

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

相关: