我有默認值的枚舉類型,如下所示:PostgreSQL枚舉默認失敗
app_type apps_status NOT NULL DEFAULT 'undeployed'::apps_status
但現在每當我試圖插入我得到一個錯誤APP_TYPE不能爲空。此外,當你繼續嘗試你會得到錯誤:Number has already been taken.
任何想法,爲什麼發生這種情況?
我有默認值的枚舉類型,如下所示:PostgreSQL枚舉默認失敗
app_type apps_status NOT NULL DEFAULT 'undeployed'::apps_status
但現在每當我試圖插入我得到一個錯誤APP_TYPE不能爲空。此外,當你繼續嘗試你會得到錯誤:Number has already been taken.
任何想法,爲什麼發生這種情況?
感謝大家幫助。然而,經過深入研究後,我意識到PostgreSQL ENUM不支持默認值,但域名是我使用域來代替的。域正在正常工作,並且正在插入默認值。 請訪問以下鏈接: http://www.sqlines.com/postgresql/how-to/create_user_defined_type
問題是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();
類似於'before_validation:initialize_stuff,:if =>:new_record?'(其中'initialize_stuff'方法會根據需要設置初始值)與驗證相結合以確保它被設置應該做的伎倆。 –
顯然Rails的發送一個NULL值(而不是關鍵字'DEFAULT'或者乾脆省略列) –
但同樣的Rails應用程序的工作原理與MySQL。 – zulq
已知MySQL在不告訴你的情況下替換值(或允許非空列中的空值) –