2013-06-12 102 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'方法会根据需要设置初始值)与验证相结合以确保它被设置应该做的伎俩。 –