6

假设我在 Postgresql 中创建了一个表,并在列上添加了注释:

create table t1 (
   c1 varchar(10)
);
comment on column t1.c1 is 'foo';

一段时间后,我决定添加另一列:

alter table t1 add column c2 varchar(20);

我想查找第一列的评论内容,并与新列关联:

select comment_text from (what?) where table_name = 't1' and column_name = 'c1'

(什么?)将是一个系统表,但是在 pgAdmin 中环顾四周并在网上搜索之后,我还没有知道它的名字。

理想情况下,我希望能够:

comment on column t1.c1 is (select ...);

但我有一种感觉,这有点扯远了。感谢您的任何想法。

更新:根据我在这里收到的建议,我最终编写了一个程序来自动化传输评论的任务,作为更改 Postgresql 列的数据类型的更大过程的一部分。你可以在我的博客上读到。

4

2 回答 2

5

接下来要知道的是如何获取表 oid。正如您所怀疑的,我认为将其用作评论的一部分是行不通的。

    postgres=# 创建表 comtest1 (id int, val varchar);
    创建表
    postgres=# 插入 comtest1 值 (1,'a');
    插入 0 1
    postgres=# 从 comtest1 中选择不同的 tableoid;
     表格
    ----------
        32792
    (1 行)

    postgres=#comtest1.id 列上的注释是“标识符一号”;
    评论
    postgres=# 选择 col_description(32792,1);
        col_description
    ----------------------
     标识符一号
    (1 行)

无论如何,我启动了一个快速的 plpgsql 函数来将注释从一个表/列对复制到另一个。您必须在数据库上创建lang plpgsql 并像这样使用它:

    将表comtest1第一列的注释复制到id
    表comtest2的列。是的,应该改进,但是
    这是留给读者的工作。

    postgres=# select copy_comment('comtest1',1,'comtest2','id');
     复制评论
    --------------
                1
    (1 行)
CREATE OR REPLACE FUNCTION copy_comment(varchar,int,varchar,varchar) RETURNS int AS $PROC$
DECLARE
        src_tbl ALIAS FOR $1;
        src_col ALIAS FOR $2;
        dst_tbl ALIAS FOR $3;
        dst_col ALIAS FOR $4;
        row RECORD;
        oid INT;
        comment VARCHAR;
BEGIN
        FOR row IN EXECUTE 'SELECT DISTINCT tableoid FROM ' || quote_ident(src_tbl) LOOP
                oid := row.tableoid;
        END LOOP;

        FOR row IN EXECUTE 'SELECT col_description(' || quote_literal(oid) || ',' || quote_literal(src_col) || ')' LOOP
                comment := row.col_description;
        END LOOP;

        EXECUTE 'COMMENT ON COLUMN ' || quote_ident(dst_tbl) || '.' || quote_ident(dst_col) || ' IS ' || quote_literal(comment);

        RETURN 1;
END;
$PROC$ LANGUAGE plpgsql;
于 2008-11-07T16:00:52.687 回答
1

您可以使用系统函数 col_description(table_oid, column_number) 检索列的注释。有关详细信息,请参阅此页面

于 2008-11-07T15:55:56.130 回答