Postgres ON CONFLICT ON CONSTRAINT 在错误日志中触发错误

Postgres ON CONFLICT ON CONSTRAINT triggering errors in the error log

我有一个 sql 语句,其中包含 ON CONFLICT ON CONSTRAINT 以允许更新。这似乎运作良好,除了我的错误日志有一堆与此查询相关的错误。

我对错误记录感到困惑,因为我们希望 运行 进入此约束,然后只进行更新 - 这里有什么问题还是这只是聊天记录?

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

您的 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 的更改(这通常是可取的)。