2013-06-12 100 views
1

我有默認值的枚舉類型,如下所示:PostgreSQL枚舉默認失敗

app_type apps_status NOT NULL DEFAULT 'undeployed'::apps_status 

但現在每當我試圖插入我得到一個錯誤APP_TYPE不能爲空。此外,當你繼續嘗試你會得到錯誤:Number has already been taken. 任何想法,爲什麼發生這種情況?

+1

顯然Rails的發送一個NULL值(而不是關鍵字'DEFAULT'或者乾脆省略列) –

+0

但同樣的Rails應用程序的工作原理與MySQL。 – zulq

+2

已知MySQL在不告訴你的情況下替換值(或允許非空列中的空值) –

回答

2

問題是NOT NULL約束,它由ORM填充,並且不可延遲。

首先,嘗試在ORM端將值設置爲DEFAULT

如果它不是在你的ORM一個可行的解決方案,嘗試添加一個觸發器,設置默認值:

create function make_default() returns trigger as $$ 
begin 
    new.app_status := 'undeployed'::apps_status 
    return null; 
end; 
$$ language plpgsql; 

create trigger before insert or delete on yourtable 
for each row when (new.app_type is null) 
execute procedure make_default(); 

如果這也不行,完全放棄了NOT NULL約束,並與強制執行約束觸發器代替:

create function reject_row() returns trigger as $$ 
begin 
    raise exception 'rejected!' 
    return null; 
end; 
$$ language plpgsql; 

create constraint trigger after insert or delete on yourtable 
for each row when (new.app_type is null) 
execute procedure reject_row(); 
+0

類似於'before_validation:initialize_stuff,:if =>:new_record?'(其中'initialize_stuff'方法會根據需要設置初始值)與驗證相結合以確保它被設置應該做的伎倆。 –