【问题标题】:Postgres ON CONFLICT ON CONSTRAINT triggering errors in the error logPostgres ON CONFLICT ON CONSTRAINT 在错误日志中触发错误
【发布时间】:2022-01-23 02:15:39
【问题描述】:

我有一个带有 ON CONFLICT ON CONSTRAINT 的 sql 语句以允许更新插入。这似乎运行良好,只是我的错误日志中有一堆与此查询相关的错误。

我对错误日志感到困惑,因为我们预计会遇到这个约束,然后只进行更新 - 这里有什么问题或者这只是聊天记录?

RDS Postgres,版本 12.7。

2021-12-18 16:00:32 UTC:172.31.1.154(33952):{username}@{database}:[28367]:ERROR: duplicate key value violates unique constraint "segments_sequence_number_event_id"
2021-12-18 16:00:32 UTC:172.31.1.154(33952):{username}@{database}:[28367]:DETAIL: Key (sequence_number, event_id)=(2, d5c70xxxx63478) already exists.
2021-12-18 16:00:32 UTC:172.31.1.154(33952):{username}@{database}:[28367]:STATEMENT: INSERT INTO segments (id,created_at,updated_at,event_id,sequence_number,start_time,end_time,bitrate,width,height) VALUES ('8e6d5xxxxbdae3','2021-12-18T16:00:32.596Z','2021-12-18T16:00:32.596Z','d5c70xxxx63478',2,1639843218000,1639843221000,2097152,1920,1080) ON CONFLICT ON CONSTRAINT sequence_number_event_id_unique DO UPDATE SET updated_at='2021-12-18T16:00:32.596Z',start_time=1639843218000,end_time=1639843221000,bitrate=2097152,width=1920,height=1080 RETURNING id,sequence_number,url,start_time,end_time,duration,bitrate,width,height,size,event_id,created_at,updated_at

【问题讨论】:

  • 请将有问题的 SQL 语句连同相关表/索引等的 DDL 语句一起发布。
  • @SebDieBln:有问题的语句隐藏在错误消息中。

标签: sql postgresql amazon-rds upsert


【解决方案1】:

您的ON CONFLICT 子句使用ON CONSTRAINT sequence_number_event_id_unique

但唯一的违规是由不同的约束引发的:unique constraint "segments_sequence_number_event_id"

要捕获所有冲突,您可以使用ON CONFLICT DO NOTHING
ON CONFLICT ... DO UPDATE 只能捕获单个“冲突目标”(单个约束、索引或索引表达式)。

相关:

旁白:您不必两次传递值。您可以通过以下方式重用排除行中的值:

...
SET (updated_at,start_time,end_time,bitrate,width,height)
  = (EXCLUDED.updated_at,EXCLUDED.start_time,EXCLUDED.end_time,EXCLUDED.bitrate,EXCLUDED.width,EXCLUDED.height)
...

见:

特殊情况差异:EXCLUDED 行中的值包括来自可能的触发器 ON INSERT 的更改(这通常是可取的)。

【讨论】:

  • 感谢您指出这一点,现在看来很明显
  • @pherris:这些名称似乎表明名称重复。也许您可以删除重复的约束?
  • 我同意 - 这些看起来像相同的约束意外应用了两次,但名称略有不同。
  • 考虑添加到一边。
猜你喜欢
  • 2016-04-26
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2013-04-09
相关资源
最近更新 更多