Таблица:
CREATE TABLE public.order_clients (
order_id int8 NOT NULL,
client_id int8 NOT NULL,
linked_at timestamptz DEFAULT now() NOT NULL,
);
В таблице есть дубликаты, и я хочу удалить не уникальные строки. Связка order_id и client_id должна быть уникальной.
Но это еще не все:
-
~43 миллиона записей в таблице. В таблицу постоянно что-то записывается
-
я не могу добавить флаг не уникальности в таблицу (таблица используется все время)
-
я также не могу записать уникальные записи в другую таблицу
-
я также не могу использовать ctid (добавляются новые записи, наверное это будет не лучшая идея)
-
я должен использовать limit и where с order_id для постепенного удаления.
Я попытался использовать этот запрос:
DELETE FROM "order_clients"
WHERE ("order_id", "client_id") IN (
SELECT "order_id", "client_id"
FROM (
SELECT "order_id", "client_id", ROW_NUMBER() OVER (PARTITION BY "order_id", "client_id" ORDER BY "order_id" ASC) AS row_num
FROM "order_clients"
WHERE "order_id" > 0
) AS subquery
WHERE row_num > 1
Однако подзапрос возвращает 315 строк, а весь запрос удаляет 324 строки (остается только один order_id с одним client_id). На бэке Node.JS, можно попробовать как-то на JS порешать.
Есть идеи?
UPD: записей в базе не 43k, а ~43 миллиона