2010-11-10 21 views
5

Şu anda yalnızca true veya null içeren birkaç boolean sütuna sahip PostgreSQL tablosum var. Yanlış PostgreSQL: psql'den birden çok sütun nasıl etkin bir şekilde değiştirilir?

  • tüm boş değerler not null kısıtlamayı
  • yani .:

    ekle

    1. yanlış
    2. Değişim varsayılan bir değer ekleyin: Ben hepsi için aşağıdakileri yapmak istiyorum
      -- 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; 
      

      Belirli bir sütunlar listesi üzerinde yineleyecek psql (veya standart SQL) özelliği var mı? Her birine bir dizi işlem uygulamak?

    cevap

    4

    Bu yapacağız, çünkü Değişkin sürümünü 8.4 veya daha yüksek gerekiyor.

    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

    Parlak, teşekkürler! Bu tek parça kod, bilmediğim yararlı şeylerle dolu. –

    9

    Tüm sütunlar üzerinde yineleme yapamazsınız, ancak güvende olmak için muhtemelen bunu yapmak istemediğinizi ancak kendinizin hangisini değiştireceğini belirtmeniz gerekir. Başka bir yol, sütun isimleri için bir komut dosyası sorgulaması yapmak ve daha sonra bunları değiştirmek olacaktır.

    Onları değiştirmek için ALTER TABLE kullanın. PgSQL doc bakınız: 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 
    

    vb

    +1

    Teşekkürler. Bunu elle nasıl yapacağımı biliyorum, ama sadece bir yineleme aracı olup olmadığını merak ediyordum. Bunu daha net hale getirmek için düzenleyeceğim :) Ayrıca 'null' değerini ayarlamadan önce null değerlerini false olarak güncellemeniz gerekiyor; varsayılanın ayarlanması 'null' değilken otomatik dönüşüme neden olmaz. –

    +1

    Çoklu, virgülle ayrılmış "ALTER COLUMN" komutları için sahne parçaları! - Daha önce sözdizimi içinde hiç fark etmedim. –

    İlgili konular