Postgres中的"On Conflict Do Nothing"在具有非空约束条件下的作用是什么?

5

是否可以使用“ON CONFLICT DO NOTHING”来避免插入并违反非空约束?

例如...

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

会产生这个错误并停止...

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).

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

相关链接:https://dba.stackexchange.com/questions/292428/postgresql-upsert-issue-with-not-null-columns - Ciro Santilli OurBigBook.com
1个回答

6
根据文档所述:
可选的ON CONFLICT子句指定了一种替代操作,以避免引发唯一性冲突排除约束冲突错误。 NOT NULL既不是唯一性约束,也不是排除约束。严格来讲,在PostgreSQL中它甚至不是一个合适的约束。
您需要的是一个BEFORE INSERT触发器,如果NEW行包含违规的null值,则返回NULL

谢谢,这很有道理。我读了文档,但没有意识到“not-null”在技术上不是一个约束条件。除了在列上设置“NOT NULL”,有更好的方法吗? - TravisVOX
不行;NOT NULL 有什么问题吗?你调查过使用触发器的选项了吗? - Laurenz Albe
我只是确保我没有漏掉其他的东西。我现在正在做触发器,它能够完成任务。我会接受你的答案。 - TravisVOX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接