首页 > 解决方案 > Postgres 从 JSONB 更新 INTEGER 列

问题描述

我有一张桌子cart

 id     | value |     metadata
--------+-------+-------------------
  45417 |     0 | {"value": "1300"}
  45418 |     0 | {"value": "1300"}
 276021 |     0 | {"value": "1300"}

我正在尝试value使用 JSONB 中的值更新列(metadata如果存在)。我想出了以下查询:

UPDATE cart SET value=CAST(subquery.meta_val as INTEGER) FROM
(SELECT id, metadata->>'value' as meta_val FROM cart
WHERE value = 0 AND 
metadata->>'value' IS NOT NULL) as subquery
WHERE cart.id=subquery.id;

现在这可行,但是我想在生产中更新 4M 行需要相当多的时间,而且在我看来,查询中有很多冗余。

我认为下一步是将所有这些包装在事务中并改进查询,有什么可以做的来提高这个查询的性能吗?

标签: sqlpostgresqljsonb

解决方案


尝试不使用子查询。

update cart as c
set value = coalesce((c.metadata->>'value')::int, 0)

推荐阅读