目录
- 解决问题
- 一、关联表更新
- 1.关联一张表
- 2.关联多张表
- 二、根据状态更新为不同的值
- 附:update对分区表使用的影响
- 总结
解决问题
通过多张关联表更新主表的字段,根据状态更新为不同的值。
一、关联表更新
1.关联一张表
更新 table1 表中 num 字段的值为 table2 表中的 sum 的值
update table1 a set a.num = b.sum from table2 b where a.id = b.rel_id and b.type = '1';
2.关php联多张表
更新 table1 表中 num 字段的值为 table2 和 table3 表中的 sum 字段的和
update table1 a set a.num = b.sum + c.sum from table2 b left join table3 c on b.id = c.rel_id where a.id = b.rel_id and c.type = '1';
update table1 a set a.num = b.sum + c.sum from table2 b, table3 c where a.id = b.rel_id and b.id = c.rel_id and c.type = '1';
二、根据状态更新为不同的值
根据 table2 表中的 type 的值,更新 table1 表中 num 字段的值
update table1 a set a.num = case when b.type = '1http://www.devze.com' then b.sum else b.sum + 1 end from table2 b where a.id = b.rel_id;
根据 table3 表中的 type 的值,更新 table1 表中 num 字段的值为 table2 表中的值
update table1 a set a.num = case when c.type = '1' then b.interest_sum else b.interest_sum + 1 end from ( select sum(interest) as interest_sum from table2 gjsroup by country ) b left join table3 c on b.rel_id = c.id where a.rel_id = b.id and a.type = '1';
附:update对分区表使用的影响
在查询这个一对多进行update执行的时候,官网还对其分区表的分区键进行update后,会不会变更其分区进行了解读:
在分区表的情况下,更新一行有可能导致它不再满足其所在分区的分区约束。此时,如果这个行满足分区树中某个其他分区的分区约束,那么这个行会被移动到那个分区。 如果没有这样的分区,则会发生错误。在后台,行的移动实际上是编程客栈一次DELETE操作和一次INSERT操作。
在移动的行上的并发UPDATE或DELETE可能会收到序列化失败错误。 假设会话 1 正在分区键上执行UPDATE,同时,对可访问该行的并发会话 2 在此行上执行UPDATE或DELETE操作。 在这种情况下,会话 2 的UPDATE 或 DELETE将检测行移动并引发序列化失败错误(该错误始终返回 SQLSTATE 代码"40001")。 如果发生这种情况,应用程序可能希望重试事务。 在通常情况下,表没有分区或没有行移动,会话 2 将标识新更新的行,并执行UPDATE/DELETE在此新行版本中。
请注意,虽然行可以从本地分区移动到外表分区(如果外数据包装器支持元组路由),但它们不能从外表分区移动到另一个分区。
总结
到此这篇关于PostgreSQL使用update语句的文章就介绍到这了,更多相关Postgresql使用update内容请搜索编程客栈(androidwww.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论