繁体   English   中英

Postgresql 9.6:问题与更新

[英]postgresql 9.6:issue with UPDATE

我坚持使用UPDATE,可能是我搞砸了:

除非要添加AND条件,否则“ proj_los ”表中预期要更新的行数为32,但是只有8个被更新。

select count(*) from import.tmp_kk where root_id = '57b2e67b-5862-499a-a471-0f2f6b23440e';
> 32

1)正确的结果->使用最后的AND子句( root_id = '57b2e67b-5862-499a-a471-0f2f6b23440e'

sql> update
       proj_los as oko
       set lo_root_id = import.tmp_kk.root_id
       from import.tmp_kk
       where oko.lo_id = import.tmp_kk.lo_id
       and import.tmp_kk.root_id = '57b2e67b-5862-499a-a471-0f2f6b23440e'
[2018-10-05 18:13:59] 32 rows affected in 50 ms


select count(*) from proj_los where lo_root_id = '57b2e67b-5862-499a-a471-0f2f6b23440e';

> 32

2)错误的结果

sql> update
         proj_los as oko
       set lo_root_id = import.tmp_kk.root_id
       from import.tmp_kk
       where oko.lo_id = import.tmp_kk.lo_id;
[2018-10-05 18:17:31] 174202 rows affected in 17 s 427 ms

select count(*) from proj_los where lo_root_id = '57b2e67b-5862-499a-a471-0f2f6b23440e';

> 8

有什么帮助吗?

您遇到了UPDATE ... FROM ...的postgres 文档中描述的问题:

使用FROM时,应确保该联接为要修改的每一行最多产生一个输出行。 换句话说,目标行不应与其他表的多个行连接。 如果是这样,那么将仅使用联接行之一来更新目标行,但是将很难预测将使用哪一行。

如果未指定root_id的附加过滤器,则更新所基于的查询很可能为每个更新的行返回多个行。 一些不可预测的行用于执行更新。 而且必须发生的是,在许多情况下,使用了错误的root_id

请注意如何更新修改的174202行(而不是您编写的8行)。 它更新了root_id更新的不相关记录中的root_id

因此,请检查import.tmp_kk表。 对于给定的lo_id它包含多于一条的记录(具有不同的root_id )。

我不明白:我说正确的结果将是该root_id的更新或32行而不是8行。

当然import.tmp_kk包含比更lo_id单个root_id ,对目标表proj_loslo_root_id将是一个FK的lo_id

对于postgres文档所关心的问题,在我看来,它基本上是在确保结果联接表中没有重复对象:

“使用FROM时,应确保该联接为要修改的每一行最多产生一个输出行。”

所以我检查了:

with tmp_joinres as (
    select oko.lo_id, gg.root_id
    from proj_los oko
    full outer join import.tmp_kk gg on oko.lo_id = gg.lo_id
)
    select tmp_joinres.lo_id, tmp_joinres.root_id, count(*)
    from tmp_joinres
    group by tmp_joinres.lo_id, tmp_joinres.root_id
    having count(*) > 1;

但没有结果:

[2018-10-05 21:58:20] 0 rows retrieved in 5 s 737 ms (execution: 5 s 729 ms, fetching: 8 ms)

您或其他人可以告诉我如何修改UPDATE语句以获得正确的结果吗?

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM