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 を調べたり Web で検索したりしても、その名前を知りませんでした。

理想的には、次のことができるようになりたいです。

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

しかし、物事を少し遠ざけているような気がします。アイデアをありがとう。

更新: ここで受け取った提案に基づいて、Postgresql 列のデータ型を変更するより大きなプロセスの一部として、コメントを転送するタスクを自動化するプログラムを作成しました。それについては私のブログで読むことができます。

4

2 に答える 2

5

次に知っておくべきことは、テーブル oid を取得する方法です。ご想像のとおり、これをコメントの一部として使用しても機能しないと思います。

    postgres=# create table comtest1 (id int, val varchar);
    テーブルを作成
    postgres=# comtest1 値 (1,'a') に挿入します。
    挿入 0 1
    postgres=# comtest1 から個別の tableoid を選択します。
     台形
    ----------
        32792
    (1行)

    postgres=# 列 comtest1.id のコメントは 'Identifier Number One';
    コメント
    postgres=# select col_description(32792,1);
        col_description
    -----------------------
     識別子ナンバーワン
    (1行)

とにかく、簡単な plpgsql 関数を作成して、あるテーブル/列のペアから別のテーブル/列のペアにコメントをコピーしました。データベースに 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 に答える