冲突时,在具有非空约束的 Postgres 中不执行任何操作

Tra*_*VOX 5 postgresql

是否不可能利用“ON CONFLICT DO NOTHING”来避免插入和违反非空约束?

例如...

INSERT INTO public.users (user, user_yob, sex) 
SELECT mom, mom_yob, 'F' 
FROM staging.users 
ON CONFLICT DO NOTHING;
Run Code Online (Sandbox Code Playgroud)

产生此错误并停止...

INSERT INTO public.users (user, user_yob, sex) SELECT mom, mom_yob, 'F' FROM staging.users ON CONFLICT DO NOTHING
> ERROR:  null value in column "user" violates not-null constraint
  DETAIL:  Failing row contains (0b159b81-6842-4ae7-961c-2e9cff8488b1, null, null, null, null, null, null, null, null, null, F).
Run Code Online (Sandbox Code Playgroud)

理想情况下,这个特定的插入将被忽略而不是引发错误。

Lau*_*lbe 6

正如文档所说:

可选ON CONFLICT子句指定引发唯一违规排除约束违规错误的替代操作。

NOT NULL既不是唯一约束也不是排除约束。从技术上讲,它甚至不是 PostgreSQL 中的适当约束。

您需要的是一个触发器,该触发器在该行包含违规空值时BEFORE INSERT返回。NULLNEW