关于冲突的postgresql - 第二次不能影响行

时间:2017-03-24 08:08:06

标签: postgresql

我有一张桌子,我在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;

首先工作正常,但不是下一个(就像我之前给你的例子)

3 个答案:

答案 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)

我认为这里发生了什么 当您对冲突进行更新时,它会进行再次冲突的更新,然后抛出该错误