obtener - crear una tabla con llave foranea en postgresql
Establecer el comentario de una columna al de otra columna en Postgresql (2)
Lo siguiente que debes 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, preparé una función plpgsql rápida para copiar los comentarios de un par de tabla / columna a otro. Tienes que crearlang plpgsql en la base de datos y usarlo así:
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;
Supongamos que creo una tabla en Postgresql con un comentario en una columna:
create table t1 (
c1 varchar(10)
);
comment on column t1.c1 is ''foo'';
Algún tiempo después, decido agregar otra columna:
alter table t1 add column c2 varchar(20);
Quiero buscar los contenidos de los comentarios de la primera columna y asociarlos a 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 poder:
comment on column t1.c1 is (select ...);
pero tengo la sensación de que está estirando las cosas un poco. 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 en mi blog .
Puede recuperar comentarios en columnas usando la función del sistema col_description (table_oid, column_number). Vea esta página para más detalles.