2008-11-07 9 views
6

Supongamos que se crea una tabla en PostgreSQL con un comentario sobre una columna:Ajuste del comentario de la columna a la de otra columna en PostgreSQL

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

Algún tiempo más tarde, decide agregar otra columna:

alter table t1 add column c2 varchar(20); 

quiero mirar hacia arriba el contenido de comentario de la primera columna, y se asocian con la nueva columna:

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

el (¿qué?) va a ser una tabla de sistema, pero después de haber mirado en pgAdmin y de buscar en la web, no he aprendido su nombre.

Idealmente me gustaría ser capaz de:

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

pero tengo la sensación de que está estirando las cosas un poco lejos. Gracias por cualquier idea

Actualización: en base a las sugerencias que recibí aquí, terminé escribiendo un programa para automatizar la tarea de transferir comentarios, como parte de un proceso más amplio de cambio del tipo de datos de una columna Postgresql. Puedes leer sobre eso on my blog.

Respuesta

5

Lo siguiente que debe saber es cómo obtener la tabla oid. Creo que usar esto como parte de un comentario no funcionará, como sospecha.

 
    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) 

De todos modos, me prepararon rápidamente una función plpgsql rápida para copiar los comentarios de un par de mesa/columna a otra. Tienes que createlang plpgsql en la base de datos y utilizar de esta manera:

 
    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

Por desgracia, "comentar en la columna t1.c2 es (seleccionar col_description ((seleccionar tableoid distinto de t1), 1))" da error de sintaxis en o cerca de "(" y eso es en la primera página abierta. Entonces, no. – dland

1

Puede recuperar los comentarios en las columnas utilizando la función del sistema col_description (table_oid, column_number). Ver this page para más detalles.

+1

no pensé acerca de las funciones, y que añade un nivel de indirección de bienvenida de las tablas subyacentes. Gracias. – dland

Cuestiones relacionadas