2014-09-20 49 views
1

使用Django,我經常需要向PostgreSQL數據庫添加新的字段。這些字段通常有一個初始值,並且它們必須設置爲NOT NULL。我對這個過程包括三個步驟:向PostgreSQL數據庫添加一個新列,設置初始值並一次設置NOT NULL

1)添加字段,並設置初始值:

ALTER TABLE my_table ADD COLUMN my_field boolean; 
UPDATE my_table SET my_field = FALSE; 

2)設置NOT NULL:

ALTER TABLE my_table ALTER COLUMN my_field SET NOT NULL; 

所有三個查詢不能一氣呵成運行,因爲這會導致PostgreSQL錯誤。

執行此任務的最有效方式是什麼?我想在單個查詢中完成此操作 - 並一次添加多個字段。沿着這些線:

ALTER TABLE my_table ADD COLUMN my_field boolean INITIAL FALSE SET NOT NULL, ADD COLUMN my_field2 boolean INITIAL FALSE SET NOT NULL; 

回答

2

你試過這個;

alter table my_table add column my_field1 boolean default false NOT NULL, 
        add column my_field2 boolean default false NOT NULL; 
+0

由於Django不設置數據庫級的默認值,我在第二步中刪除這個。雖然這個序列看起來效率不如我原來的那麼高,但我更喜歡你的方式,因爲在我們大量使用的數據庫上創建一個字段後,我經常無法正確分配NOT NULL標誌。新的空值會被添加得太快...... – 2014-09-20 09:02:57

0

你可以用你的DDL到下面給出一個溫控功能,這將是你的情況是個好主意,是你的情況的一個例子。

希望它的作品!

CREATE OR REPLACE FUNCTION altertable(tablename text, colname text, coltype text,coldef text) 
RETURNS void AS 
$BODY$ 
BEGIN 
EXECUTE ' ALTER TABLE '|| quote_ident(tablename) || ' ADD COLUMN ' || quote_ident(colname) ||' '|| coltype ||' DEFAULT '||coldef||' NOT NULL'; END $BODY$ 
LANGUAGE plpgsql VOLATILE 
  • 點的意義:能夠改變任何表,任何COLUMN_TYPE
  • 用法:

    select altertable('tbl1','bool_col','boolean','true') 
    select altertable('tbl2','int_col','Integer','1')