开发者社区> 问答> 正文

如果值不在ENUM中,则更改插入值

我想向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

展开
收起
montos 2020-03-27 17:33:31 574 0
1 条回答
写回答
取消 提交回答
  • 就而言,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';之类的仲裁字符串。在我看来,这是代表无与伦比的价值的正确方法。

    DB Fiddle上的演示

    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

    2020-03-27 17:34:55
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载