我有默认值的枚举类型,如下所示: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在不告诉你的情况下替换值(或允许非空列中的空值) –