在数据库中查找重复项并重命名

时间:2010-07-30 23:11:58

标签: postgresql duplicates unique

我在Postgres有一张桌子,里面装满了文章。这些文章有一个与它们相关的url slug,用于将它们显示为example.com/pretty_name而不是example.com\2343

不幸的是,当我开始时,我对网址强加了一个独特的约束,但是在不区分大小写的基础上忽略了这一点,我想纠正错误并开始要求网址是唯一的而不考虑大小写。< / p>

作为第一步,我需要修复已存在于我的数据库中的所有重复网址。 如何在不区分大小写的情况下在表中搜索具有重复网址的行,并按原样保留一行,而对于其余的重复项,在末尾附加类似“_2”的内容?

这特别棘手,因为我不是100%确定没有多次重复网址。也就是说,我可能在一个网址上有3个重复项,在这种情况下,理想情况下我希望第一个为pretty_name,第二个为pretty_name_2,第三个为pretty_name_3。< / p>

1 个答案:

答案 0 :(得分:4)

如果您在桌面上有某种独特的ID:

UPDATE articles a1 set url = a1.url||'_2' 
WHERE a1.id not in (select max(a2.id) from articles a2 group by lower(a2.url));

如果您没有唯一ID:

UPDATE articles a1 set url = a1.url||'_2' 
WHERE a1.ctid not in (select max(a2.ctid) from articles a2 group by lower(a2.url));