Найти дубликаты в базе данных и переименовать - PullRequest
3 голосов
/ 31 июля 2010

У меня есть стол в Postgres, который полон статей.У статей есть связанный с ними URL-слаг, который используется для отображения их как example.com/pretty_name, а не example.com\2343.

К сожалению, когда я начинал, я применял уникальное ограничение на URL-адреса, но пренебрегалсделать это без учета регистра, и я бы хотел исправить это и начать требовать, чтобы URL были уникальными, без учета регистра.

В качестве первого шага мне нужно исправить все дубликаты URLуже присутствует в моей базе данных. Как найти в таблице строки с дублирующимися URL-адресами без учета регистра и оставить одну строку как есть, а для остальных дубликатов добавить в конец что-то вроде '_2'?

Это особенно сложно, потому что я не уверен на 100%, что URL не дублируются более одного раза.Т.е. у меня может быть 3 дубликата на одном URL, и в этом случае в идеале я бы хотел, чтобы первый был pretty_name, второй - pretty_name_2, а третий - pretty_name_3.

1 Ответ

4 голосов
/ 31 июля 2010

Если у вас есть какой-то уникальный идентификатор в таблице:

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));

Если у вас нет уникального идентификатора:

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));
...