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

标签 java sql postgresql jdbc sql-insert

我想给 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'

如何在插入时使用条件插入或更新值?

最佳答案

就此而言,on conflict 不识别枚举违规。 INSERT documentation说:

The optional ON CONFLICT clause specifies an alternative action to raising a unique violation or exclusion constraint violation error.

不幸的是,枚举类型不属于该类别(同样适用于检查约束,否则这可能是这里可能的解决方案)。

我们可以求助于使用 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' 的任意字符串;在我看来,这像是表示不匹配值的正确方法。

Demo on 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;
name | state
:--- | :----
Bob  | null 
Bill | AL   

关于java - 如果值不在 ENUM 中,则更改插入值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60662997/

相关文章:

sql - 外键约束的条件级联操作?

mysql - 将加密数据从MYSQL服务器迁移到Sql服务器

python - 将 postgresql 与 sqlalchemy 连接起来

ruby-on-rails - 如何使用 POSTGRES 在行之间循环以一次输出一个随机的 "something"?

java - Spark : driver/worker configuration. 驱动程序是否在主节点上运行?

java - 如何使用多线程在java中找到二维数组的最大值

java - 如何在 Hibernate 中对同一张表进行子查询?

java - PostgreSQL 9.0 JDBC 驱动程序是否适用于 64 位 java?

java - CRC32的低16位真的是CRC16吗?

java - XML 布局 2 个 View 居中,1 个在顶部