Postgres - удаление дублирующихся строк для обеспечения работы уникального индекса - PullRequest
0 голосов
/ 05 июля 2019

У меня есть таблица, структурированная как:

id | foodid | ingredientid

Я хочу создать уникальный индекс следующим образом:

create unique index foodingredient_foodid_ingredientid_uindex
    on foodingredient (foodid, ingredientid);

Проблема в том, что таблица содержит много дубликатов foodid и ингридиентовзаписей.Они не нужны, и я хочу их удалить.

Если я запустил:

select count(*)
from foodingredient
group by foodid, ingredientid
having count(*) > 1
order by count desc

Это возвращает полмиллиона строк.Так что исправить это вручную не вариант.

Итак, я хочу удалить все дубликаты, сохранив оригинал.

Т.е.

id | foodid | ingredientid
1  | 144    | 531
2  | 144    | 531
3  | 144    | 531
4  | 144    | 531

Становится:

id | foodid | ingredientid
1  | 144    | 531

Есть ли способ сделать это с помощью запроса?

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Вы можете сделать это с помощью:

delete from foodingredient t
where exists (
  select 1 from foodingredient
  where foodid = t.foodid and ingredientid = t.ingredientid and id < t.id
)

См. Демоверсию .

0 голосов
/ 05 июля 2019
DELETE FROM foodingredient a
USING foodingredient b
WHERE a.id > b.id
    AND a.foodid = b.foodid 
    AND a.ingredientid = b.ingredientid;
...