MySQL ma bardzo nieprzyjemny ograniczenie, które nie mogą korzystać z tabeli, która jest aktualizowana/usunięte/włożoną w sub -Wybierz.
Można jednak obejść ten problem, dołączając do tabeli, która ma zostać usunięta (zamiast korzystać z opcji podrzędnej).
Zakładając masz jakieś unikalnego identyfikatora w tabeli (zakładam kolumnę id
w następującym oświadczeniem):
DELETE d
FROM table_with_duplicates d
JOIN (
SELECT min(id) as min_id, field
FROM table_with_duplicates
GROUP BY field
) keep ON keep.field = d.field
AND keep.min_id <> d.id;
to zachowa jeden wiersz dla każdej z dwóch egzemplarzach (jeden z Lowes wartość w kolumnie id
).
Jeśli chcesz usunąć wszystkie duplikaty wierszy (nie przechowuje co najmniej jednego), po prostu usuń warunek AND keep.min_id <> d.id
.
Edit
Jeśli nie masz niepowtarzalną kolumnę, ale chcesz usunąć wszystkie duplikaty (nie utrzymanie co najmniej jednego rzędu), a następnie można użyć:
DELETE d
FROM table_with_duplicates d
JOIN (
SELECT field
FROM table_with_duplicates
GROUP BY field
HAVING count(*) > 1
) del ON del.field = d.field;
Czy pojawił się komunikat o błędzie lub czy zapytanie zostało pomyślnie uruchomione? –
Czy Twoje zapytanie nie usunie wszystkich pól, w tym duplikatów? jeśli masz 2 duplikaty z tym identyfikatorem, twoje zapytanie IN() usunie oba. Nie chcesz zachować przynajmniej jednego rekordu? – GGio
mysql nie pozwala aktualizować/usuwać w tabeli, z której wybierasz dane. –