Мы пытаемся добавить уникальное ограничение в нашу таблицу postgres таким образом, чтобы удалить дубликаты, а не выдавать ошибку. Уникальное ограничение охватывает два столбца, а первичный ключ отсутствует. Например:
i_id | term | date_created
1 | 'mako' | 123456789
1 | 'mako' | 123451234
1 | 'tele' | 213456852
2 | 'rake' | 598521542
Итак, в этом примере нам нужно будет удалить эту вторую строку, прежде чем мы сможем безопасно добавить ограничение уникальности. Обычно мы выполняем команду удаления с добавлением отдельного выделенного элемента, но у нас нет отличительного ключа для строк. В частности, уникальный ключ будет находиться над столбцами [i_id, term].
(WTF разве у нас не было уникального ограничения с самого начала? Иди с цифрой.)
Я думаю, что удаление лучше всего, но я не могу просто написать
delete from table where row_id not in (select row_id ... distinct something ... )
потому что нет первичного ключа для строки. Я бы предпочел избежать временной таблицы, если это возможно. Есть предложения?
РЕДАКТИРОВАТЬ: Извините. Мы используем postgres 8.4.
РЕДАКТИРОВАТЬ 2: Решение, которое мы используем:
delete from table where ctid not in (
select
distinct on (i_id, term)
ctid
from table
order by i_id, term
);
Спасибо, ребята!