2008-11-07 11 views
6

मान लीजिए मैं एक स्तंभ पर एक टिप्पणी के साथ Postgresql में एक तालिका बनाने: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 में चारों ओर देखने और वेब पर खोज करने के बाद मैंने इसका नाम नहीं सीखा है।

आदर्श रूप में मैं करने में सक्षम होना चाहते हैं:

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

लेकिन मुझे लगता है कि चीज़ें थोड़ी दूर खींच रहा है। किसी भी विचार के लिए धन्यवाद।

अद्यतन: यहां प्राप्त सुझावों के आधार पर, मैंने पोस्टग्रेस्क्ल कॉलम के डेटाटाइप को बदलने की एक बड़ी प्रक्रिया के हिस्से के रूप में टिप्पणियों को स्थानांतरित करने के कार्य को स्वचालित करने के लिए एक प्रोग्राम लिखना घायल कर दिया। आप उस on my blog के बारे में पढ़ सकते हैं।

उत्तर

5

पता करने के लिए अगली बात यह है कि टेबल ओड कैसे प्राप्त करें। मुझे लगता है कि इस पर टिप्पणी के हिस्से के रूप में इसका उपयोग काम नहीं करेगा, जैसा कि आपको संदेह है।

 
    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) 

किसी भी तरह, मैं एक से दूसरे टेबल/स्तंभ जोड़ी से टिप्पणी की नकल के लिए एक त्वरित plpgsql समारोह ऊपर मार पड़ी है। आप इस तरह डेटाबेस पर plpgsql createlang और इसका इस्तेमाल करने के लिए है:

 
    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

हां, "कॉलम t1.c2 पर टिप्पणी है (col_description का चयन करें ((t1 से अलग tableoid का चयन करें), 1)" "वाक्यविन्यास त्रुटि को या उसके पास देता है" ("और यह पहले खुले माता-पिता पर है। तो, नहीं। – dland

1

आप सिस्टम फ़ंक्शन col_description (table_oid, column_number) का उपयोग करके कॉलम पर टिप्पणियां पुनर्प्राप्त कर सकते हैं। अधिक जानकारी के लिए this page देखें।

+1

मैं कार्यों के बारे में नहीं सोचा था, और कहा कि अंतर्निहित तालिकाओं से अविवेक के एक स्वागत योग्य स्तर कहते हैं। धन्यवाद। – dland

संबंधित मुद्दे