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