18 июл. 2011 г.

Удаление дубликатов из таблиц (PostgreSQL)

Так случилось, что образовалась в одной из postgresql-ных баз табличка, в которой было две абсолютно одинаковые строки. И еще и без первичного ключа. Забавно то, что pgadmin3 открывает такую табличку только на чтение, потому что нет первичного ключа, соответственно удалить лишнюю строчку там, явно указав ее мышкой, не выходит, а drop-нуть с помощью psql тоже трудно, ведь строчки одинаковые, и любой WHERE их обе зацепляет и отдает DROP'у. В общем, вилы ;) Решение, сильно напоминающее школьно-универский "пузырьковый метод сортировки", подсмотрено тут:
CREATE TABLE foo AS (SELECT DISTINCT * FROM bar); 
DROP TABLE bar; 
ALTER TABLE foo RENAME TO bar;
где foo - новая таблица, bar - таблица с дубликатами.  Оператор SELECT DISTINCT вычленяет только уникальные строки.