我想向Postgres插入值
如果我在表中有枚举类型并且想要更改输入值,则不在枚举列表中
喜欢
create type us_state as enum ('AL', ..., 'NULL');
insert into user (name, state)
values ('Bob', 'AA')
conflict on state is not valid us_state update value = 'NULL'
如何在插入时使用条件插入或更新值?
问题来源:Stack Overflow
就而言,on conflict不承认枚举违规。该INSERT文件说:
可选ON CONFLICT子句指定引发唯一违反或排除约束违反错误的替代操作。
不幸的是,枚举类型不属于该类别(同样适用于检查约束,否则在这里可能是可能的解决方案)。
我们可以使用列出枚举值的技巧enum_range(),然后在条件表达式中使用它:
insert into users(name, state)
select
name,
case when state = any(enum_range(null::us_state)::name[])
then state::us_state
end
from (values ('Bob', 'AA')) t(name, state)
请注意,NULL当给定值不存在于枚举中时,它将生成一个值,而不是诸如'NULL';之类的仲裁字符串。在我看来,这是代表无与伦比的价值的正确方法。
create type us_state as enum ('AL', 'WA');
create table users(name text, state us_state);
-- an attempt with "on conflict"
insert into users (name, state) values ('Bob', 'AA') on conflict(state) do nothing
-- ERROR: invalid input value for enum us_state: "AA";
-- LINE 1: insert into users (name, state) values ('Bob', 'AA') on conf...
-- new query
insert into users(name, state)
select
name,
case when state = any(enum_range(null::us_state)::name[])
then state::us_state
end
from (values ('Bob', 'AA'), ('Bill', 'AL')) t(name, state);
-- 2 rows affected
select * from users;
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。