2008-11-07 10 views
6

Giả sử tôi có thể tạo một bảng trong PostgreSQL với một bình luận trên một cột:Thiết bình luận của một cột với các cột khác trong PostgreSQL

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

Một thời gian sau, tôi quyết định thêm một cột nữa:

alter table t1 add column c2 varchar(20); 

tôi muốn tìm kiếm các nội dung bình luận của cột đầu tiên, và liên kết với các cột mới:

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

các (Cái gì?) sẽ là một bảng hệ thống, nhưng sau khi nhìn xung quanh trong pgAdmin và tìm kiếm trên web tôi đã không học được tên của nó.

Lý tưởng nhất là tôi muốn để có thể:

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

nhưng tôi có cảm giác đó là kéo dài điều một chút xa. Cảm ơn mọi ý tưởng.

Cập nhật: dựa trên các đề xuất tôi nhận được ở đây, tôi sẽ viết một chương trình để tự động hóa nhiệm vụ chuyển nhận xét, như một phần của quá trình thay đổi kiểu dữ liệu của cột Postgresql. Bạn có thể đọc về điều đó on my blog.

Trả lời

5

Điều tiếp theo cần biết là làm thế nào để có được bảng oid. Tôi nghĩ rằng việc sử dụng điều này như là một phần của bình luận sẽ không hoạt động, như bạn nghi ngờ.

 
    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) 

Nhưng dù sao, tôi đã bật chức năng plpgsql nhanh để sao chép nhận xét từ cặp bảng/cột này sang cặp khác. Bạn phải createlang plpgsql trên cơ sở dữ liệu và sử dụng nó như thế này:

 
    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

Than ôi, "chú thích trên cột t1.c2 là (chọn col_description ((chọn riêng biệt tableoid từ t1), 1))" cho lỗi cú pháp tại hoặc gần "(" và đó là lúc mở đầu tiên paren. Vì vậy, không. – dland

1

Bạn có thể truy xuất các nhận xét về các cột bằng cách sử dụng hàm hệ thống col_description (table_oid, column_number). Xem this page để biết thêm chi tiết.

+1

Tôi không suy nghĩ về chức năng, và có thêm một mức độ hoan nghênh gián tiếp từ các bảng cơ bản. Cảm ơn. – dland