Postgres - 使用递增值更新CTE

时间:2018-04-12 20:54:17

标签: sql postgresql common-table-expression

我有一个包含organization_idname列的表格。我需要为这些列添加复合唯一索引,但是我们有一些需要更新的重复名称。我可以使用此查询找到有问题的记录:

with cte as (select l.id, t.*
from locations l
join (
  select name, organization_id, count(*) as qty
  from locations
  group by name, organization_id
  having count(*) > 1
) t on l.name = t.name and l.organization_id = t.organization_id )

我想通过在名称上附加一些递增值来更新记录(这不是生产数据,不要判断我:D)。

类似

update locations
set name = locations.name || (select i from generate_series(1..some_count))::text
from cte

1 个答案:

答案 0 :(得分:2)

尝试使用序列:

CREATE SEQUENCE public.blahblah;

然后

UPDATE
    locations
SET
    name = locations.name || nextval('public.blahblah')
FROM
    cte
WHERE
    locations.id = cte.id;

这是安全的,因为

  

即使多个会话同时执行nextval,每个会话也会   安全地接收不同的序列值

  

避免阻止从中获取数字的并发事务   相同的顺序,nextval操作永远不会回滚;就是一次   已获取一个值,它被认为是使用的,不会被使用   又回来了。即使周围的交易稍后也是如此   中止,或者如果调用查询最终没有使用该值。

请参阅documentation