2010-11-10 12 views
5

मेरे पास कई बूलियन कॉलम के साथ PostgreSQL तालिका है, वर्तमान में केवल सत्य या शून्य है। झूठी PostgreSQL: psql से कई स्तंभों को कुशलता से बदलने के लिए कैसे?

  • करने के लिए सभी शून्य मान एक not null बाधा
  • यानी .:

    जोड़े

    1. झूठी
    2. बदलें डिफ़ॉल्ट मान जोड़ें: मैं उन सभी के लिए निम्न कार्य करने के
      -- for each column specified: 
      update my_table set my_column = 'f' where my_column is null; 
      alter table my_table alter column my_column set default 'f'; 
      alter table my_table alter column my_column set not null; 
      

      क्या psql (या मानक SQL) की एक विशेषता है जो स्तंभों की एक निर्दिष्ट सूची में पुनरावृत्त होगी और प्रत्येक के लिए संचालन का एक अनुक्रम लागू करें?

    उत्तर

    4

    यह क्या करेंगे, variadic की वजह से संस्करण 8.4 या उच्चतर की आवश्यकता है।

    CREATE OR REPLACE FUNCTION setdefaults(
        IN _tname TEXT,  -- tablename to alter 
        VARIADIC _cname TEXT[] -- all columnnames to alter 
    ) 
    RETURNS boolean 
    LANGUAGE plpgsql 
    AS 
    $$ 
    DECLARE 
        row record; 
    BEGIN 
        FOR row IN SELECT unnest(_cname) AS colname LOOP 
         EXECUTE 'ALTER TABLE ' || quote_ident(_tname) || ' ALTER COLUMN ' || quote_ident(row.colname) || ' SET DEFAULT false;'; 
         EXECUTE 'UPDATE ' || quote_ident(_tname) || ' SET ' || quote_ident(row.colname) || ' = DEFAULT WHERE ' || quote_ident(row.colname) || ' IS NULL;'; 
         EXECUTE 'ALTER TABLE ' || quote_ident(_tname) || ' ALTER COLUMN ' || quote_ident(row.colname) || ' SET NOT NULL;'; 
        END LOOP; 
    
        RETURN TRUE; 
    END; 
    $$; 
    
    SELECT setdefaults('foo', 'x','y','z'); -- alter table "foo" 
    
    +0

    शानदार, धन्यवाद! कोड का यह एक टुकड़ा उपयोगी सामान से भरा हुआ है जिसे मैं नहीं जानता था। –

    9

    आप सभी कॉलम पर पुन: सक्रिय नहीं हो सकते हैं, लेकिन सुरक्षित होने के लिए आप संभवतः ऐसा नहीं करना चाहते हैं लेकिन निर्दिष्ट करें कि कौन से लोगों को स्वयं बदलना है। एक और तरीका कॉलम नामों के लिए एक स्क्रिप्ट पूछताछ करना होगा और फिर उन्हें बदलना होगा।

    उन्हें बदलने के लिए आप ALTER TABLE का उपयोग करें। PgSQL दस्तावेज़ देखें: http://www.postgresql.org/docs/8.4/static/sql-altertable.html

    ALTER TABLE xy ALTER COLUMN a SET DEFAULT FALSE, ALTER COLUMN b SET NOT NULL 
    

    आदि

    +1

    धन्यवाद। मुझे पता है कि इसे मैन्युअल रूप से कैसे किया जाए, लेकिन यह सोच रहा था कि कोई पुनरावृत्ति उपकरण था या नहीं। मैं इसे स्पष्ट करने के लिए संपादित करूँगा :) इसके अलावा 'शून्य नहीं' सेट करने से पहले शून्य मान को गलत पर अपडेट करना आवश्यक है, अन्यथा आपको कोई त्रुटि मिलती है; डिफ़ॉल्ट सेटिंग को 'शून्य नहीं' जोड़ने पर स्वचालित रूपांतरण नहीं होता है। –

    +1

    एकाधिक, अल्पविराम से अलग 'अलर्ट कॉलम' आदेशों के लिए प्रॉप्स हालांकि! - मैंने कभी नहीं देखा कि पहले वाक्यविन्यास में। –

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