2008-11-07 4 views
6

Supposons que je crée une table Postgresql avec un commentaire sur une colonne:Réglage du commentaire d'une colonne à celle d'une autre colonne dans Postgresql

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

Quelque temps plus tard, je décide d'ajouter une autre colonne:

alter table t1 add column c2 varchar(20); 

Je veux regarder le contenu du commentaire de la première colonne, et associé à la nouvelle colonne:

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

le (quoi?) va être une table système, mais après avoir regardé autour de pgAdmin et chercher sur le web je n'ai pas appris son nom.

Idéalement, je voudrais pouvoir:

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

mais j'ai un sentiment qui est l'étirement des choses un peu loin. Merci pour vos idées. Mise à jour: basé sur les suggestions que j'ai reçues ici, j'ai fini par écrire un programme pour automatiser la tâche de transfert de commentaires, dans le cadre d'un processus plus large de modification du type de données d'une colonne Postgresql. Vous pouvez lire à ce sujet on my blog.

Répondre

5

La prochaine chose à savoir est comment obtenir l'OID de la table. Je pense que cela ne fonctionnera pas comme vous le pensez.

 
    postgres=# create table comtest1 (id int, val varchar); 
    CREATE TABLE 
    postgres=# insert into comtest1 values (1,'a'); 
    INSERT 0 1 
    postgres=# select distinct tableoid from comtest1; 
    tableoid 
    ---------- 
     32792 
    (1 row) 

    postgres=# comment on column comtest1.id is 'Identifier Number One'; 
    COMMENT 
    postgres=# select col_description(32792,1); 
     col_description 
    ----------------------- 
    Identifier Number One 
    (1 row) 

Quoi qu'il en soit, je fouetté une fonction plpgsql rapide pour copier les commentaires d'une paire de table/colonne à l'autre. Vous devez createlang plpgsql sur la base de données et l'utiliser comme ceci:

 
    Copy the comment on the first column of table comtest1 to the id 
    column of the table comtest2. Yes, it should be improved but 
    that's left as work for the reader. 

    postgres=# select copy_comment('comtest1',1,'comtest2','id'); 
    copy_comment 
    -------------- 
       1 
    (1 row) 
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; 
+1

Hélas, "commentez sur la colonne t1.c2 est (sélectionnez col_description ((sélectionnez distinct tableoid de t1), 1))" donne une erreur de syntaxe à ou près de "(" et c'est à la première paren ouverte. – dland

1

Vous pouvez récupérer des commentaires sur des colonnes à l'aide de la fonction système col_description (table_oid, column_number). Voir this page pour plus de détails.

+1

Je ne pensais pas sur les fonctions, et qui ajoute un niveau d'accueil de indirection des tables sous-jacentes. Merci. – dland

Questions connexes