我有一个包含organization_id
和name
列的表格。我需要为这些列添加复合唯一索引,但是我们有一些需要更新的重复名称。我可以使用此查询找到有问题的记录:
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
答案 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。