我有一张桌子,我在data_id上有自动编号/序列
tabledata
---------
data_id [PK]
data_code [Unique]
data_desc
示例代码:
insert into tabledata(data_code,data_desc) values(Z01,'red')
on conflict (data_code) do update set data_desc=excluded.data_desc
工作正常,然后我再次插入
insert into tabledata(data_code,data_desc) values(Z01,'blue')
on conflict (data_code) do update set data_desc=excluded.data_desc
我收到了这个错误
[Err] ERROR:ON CONFLICT DO UPDATE命令不能再次影响行 提示:确保在同一命令中不建议插入的行具有重复的约束值。
这是我的真实代码
insert into psa_aso_branch(branch_code,branch_desc,regional_code,status,created_date,lastmodified_date)
(select branch_code, branch, kode_regional,
case when status_data='Y' then true
else false end, current_date, current_date
from branch_history) on conflict (branch_code) do
update set branch_desc = excluded.branch_desc, regional_code = excluded.regional_code,status = (case when excluded.status='Y' then true else false end), created_date=current_date, lastmodified_date=current_date;
首先工作正常,但不是下一个(就像我之前给你的例子)
答案 0 :(得分:2)
我在这个问题上被困了大约 24 小时。
当我在 cli 上测试查询时很奇怪,它工作正常。当我使用一个数据行进行插入时,它工作正常。此错误仅在我使用 insert-select
时出现。
这主要不是因为 insert-select
问题。这是因为 select
行不是唯一的。这将多次触发 CONFLICT
。
感谢@zivaricha 的评论。我从他的笔记中进行实验。只是一开始很难理解。
解决办法: 使用 distinct 确保选择返回唯一结果。
答案 1 :(得分:1)
您可以在现有记录/行上使用更新而不是您要插入的行。 这里更新的冲突条款适用于排除表中的行。暂时保留行
在第一种情况下插入recored,因为data_code没有冲突。并且根本不执行更新
在第二个插入中,您插入的Z01已作为data_code插入,而data_code是唯一的。
排除的表在更新后仍保留data_code的重复值。所以没有插入recored。在更新集中,必须更改data_code才能正确插入记录
答案 2 :(得分:1)
我认为这里发生了什么 当您对冲突进行更新时,它会进行再次冲突的更新,然后抛出该错误