Potrzebuję DELETE
zduplikowanych wierszy dla określonego identyfikatora sid w MySQL
tabeli.
Jak mogę to zrobić za pomocą zapytania SQL?
DELETE (DUPLICATED TITLES) FROM table WHERE SID = "1"
Coś takiego, ale nie wiem, jak to zrobić.
mysql
duplicates
Ali Demirci
źródło
źródło
Odpowiedzi:
usuwa to duplikaty w miejscu, bez tworzenia nowej tabeli
uwaga: działa dobrze tylko wtedy, gdy indeks mieści się w pamięci
źródło
ALTER IGNORE
.ALTER TABLE foo ENGINE MyISAM
żeby to obejść, po czym z powrotem wymieniłem silnik.Załóżmy, że masz tabelę
employee
z następującymi kolumnami:Aby usunąć wiersze ze zduplikowaną
first_name
kolumną:źródło
employee
ze sobą dla jednego dopasowania indeksu i jedno>
sprawdzenie indeksu będzie powolne w przypadku dużych tabel. Czy nie byłoby lepiej,SELECT MAX(ID) FROM t GROUP BY unique
a potemJOIN
dokładnym dopasowaniemID
doMAX(ID)
?Następnie usuń duplikaty wszystkich identyfikatorów SID, nie tylko jednego.
Ze stołem temp
Ponieważ
temp_table
jest świeżo utworzony, nie ma indeksów. Musisz je odtworzyć po usunięciu duplikatów. Możesz sprawdzić, z jakimi indeksami masz w tabeliSHOW INDEXES IN table
Bez tabeli temp:
źródło
SELECT * FROM table GROUP BY title, SID;
Wszystko zależy od tego, jak dobrze wiesz, co robisz.Usuwanie zduplikowanych wierszy w miejscu MySQL, (zakładając, że masz kolumnę sygnatury czasowej do sortowania):
Utwórz tabelę i wstaw kilka wierszy:
Usuń duplikaty w miejscu:
Gotowe, zduplikowane wiersze są usuwane, zachowywany jest ostatni według sygnatury czasowej.
Dla tych z Was, którzy nie mają sygnatury czasowej ani unikalnej kolumny.
Nie masz
timestamp
unikatowej kolumny indeksu do sortowania? Żyjesz w stanie degeneracji. Będziesz musiał wykonać dodatkowe czynności, aby usunąć zduplikowane wiersze.utwórz tabelę pingwinów i dodaj kilka wierszy
zrobić klon pierwszej tabeli i skopiować do niej.
Agregat max działa na nowym indeksie moo:
obserwować i porządkować
Co robi ta duża instrukcja usuwania SQL?
Pingwiny stołowe z aliasem „a” pozostają połączone z podzbiorem pingwinów stołowych zwanych aliasami „b”. W prawej tabeli „b”, która jest podzbiorem, znajduje się maksymalny znacznik czasu [lub max moo] pogrupowany według kolumn foo i bar. Jest to dopasowane do tabeli „a” po lewej stronie. (foo, bar, baz) po lewej stronie ma każdy wiersz w tabeli. Podzbiór „b” po prawej stronie ma (maxtimestamp, foo, bar), który jest dopasowywany do lewej tylko na tym, który JEST maksymalny.
Każdy wiersz inny niż maksymalna ma wartość maxtimestamp równą NULL. Przefiltruj te wiersze NULL i masz zestaw wszystkich wierszy pogrupowanych według foo i bar, który nie jest najnowszym bazem sygnatury czasowej. Usuń te.
Przed uruchomieniem wykonaj kopię zapasową tabeli.
Zapobiegaj ponownemu występowaniu tego problemu na tym stole:
Jeśli to zadziałało i ugasiło pożar w „zduplikowanym rzędzie”. Wspaniały. Teraz zdefiniuj nowy złożony unikatowy klucz w tabeli (w tych dwóch kolumnach), aby w pierwszej kolejności zapobiec dodawaniu większej liczby duplikatów.
Podobnie jak w przypadku dobrego układu odpornościowego, złe wiersze nie powinny nawet trafiać do stołu w momencie wstawiania. Później wszystkie programy dodające duplikaty będą emitować swój protest, a kiedy je naprawisz, ten problem nigdy się nie pojawi.
źródło
ID
kolumnę z automatycznym zwiększaniem,ON
klauzula musi tylko pasować doID
kolumny, nic więcej.Po tym, jak sam natknąłem się na ten problem, na ogromnej bazie danych, nie byłem pod wrażeniem wydajności żadnej z innych odpowiedzi. Chcę zachować tylko ostatni zduplikowany wiersz, a resztę usunąć.
W przypadku instrukcji z jednym zapytaniem, bez tabeli tymczasowej, działało to najlepiej,
Jedynym zastrzeżeniem jest to, że muszę uruchamiać zapytanie wiele razy, ale mimo to okazało się, że działa lepiej niż inne opcje.
źródło
To zawsze wydaje się działać dla mnie:
Który zachowuje najniższy identyfikator dla każdego z dupleksów i reszty rekordów bez dupleksu.
Podjąłem również następujące kroki, aby problem z kopiowaniem nie występował już po usunięciu:
Innymi słowy, tworzę duplikat pierwszej tabeli, dodaję unikalny indeks do pól, których nie chcę mieć duplikatów, a następnie wykonuję operację,
Insert IGNORE
która ma tę zaletę, że nie zawodzi jak zwykleInsert
przy pierwszej próbie dodania zduplikowany rekord oparty na dwóch polach i raczej ignoruje takie rekordy.Poruszając się dalej, niemożliwe staje się utworzenie jakichkolwiek zduplikowanych rekordów na podstawie tych dwóch pól.
źródło
ORDER BY
w,SELECT
aby mieć pewność, który rekord trafi do kataloguNoDupeTable
?ORDER by ID Asc
nic nie zaszkodzi, więc i tak zmienię odpowiedź.Select Max(ID)
a,Order by Max(ID)
ale wystarczy odwrócić kolejność wkładek. Wydaje mi się, że uzyskanie najwyższego identyfikatora wymagałoby bardziej złożonego łączenia typu select, ponieważ niezależnie od tego, jak zamówisz powyżej, będziesz pobierać wartości pól z niższego identyfikatora.MAX(ID)
lubMIN(ID)
i zamiast*
wSELECT FROM DupeTable
chociaż, w przeciwnym razie po prostu otrzymaszID
losowo jedną z kolumn . W rzeczywistości wiele SQL, a nawet MySQL, wymaga wywołania funkcji agregującej w każdej kolumnie, która nie została określona wGROUP BY
klauzuli.ID,First,Last,Notes
i rekordami,1,Bob,Smith,NULL
a2,Bob,Smith,Arrears
następnie wykonanie aSELECT *Max(ID), First,Last,Notes FROM DupeTable group by First,Last
zwróciłoby ten sam rekord, 1, z wyjątkiem z innym identyfikatorem. Zwróci wartość Max (ID),2,Bob,Smith,NULL
a Min (ID)1,Bob,Smith,NULL
. Wydaje mi się, że uzyskanie drugiego rekordu z napisem „Zaległości” w notatkach wymaga połączenia.Poniższe działa dla wszystkich tabel
źródło
Oto prosta odpowiedź:
źródło
and a.id_field = b.id
LEFT JOIN
Abyb
tylko musi porównaćb.id
=a.id_field
zakładającfield_id
to unikatowy identyfikator automatycznego przyrostu. taka.field_being_repeated = b.field_being_repeated
jest obce. (równieżb.id_field
nie występuje w tym zapytaniu tob.id
.To działa dla mnie, aby usunąć stare rekordy:
Możesz zamienić min (e.id) na max (e.id), aby usunąć najnowsze rekordy.
źródło
źródło
Powyżej znajduję rozwiązanie Wernera najwygodniejsze, ponieważ działa niezależnie od obecności klucza podstawowego, nie zadziera z tabelami, wykorzystuje przyszłościowy zwykły sql, jest bardzo zrozumiałe.
Jak wspomniałem w swoim komentarzu, to rozwiązanie nie zostało jednak właściwie wyjaśnione. Więc to jest moje, oparte na tym.
1) dodaj nową kolumnę logiczną
2) dodaj ograniczenie do zduplikowanych kolumn ORAZ nowej kolumny
3) ustaw kolumnę logiczną na wartość true. To się powiedzie tylko w jednym ze zduplikowanych wierszy z powodu nowego ograniczenia
4) usuń wiersze, które nie zostały oznaczone jako tokeep
5) upuść dodaną kolumnę
Proponuję zachować dodane ograniczenie, aby w przyszłości uniknąć nowych duplikatów.
źródło
Ta procedura usunie wszystkie duplikaty (w tym wielokrotności) z tabeli, zachowując ostatni duplikat. Jest to rozszerzenie opcji Pobieranie ostatniego rekordu w każdej grupie
Mam nadzieję, że to komuś się przyda.
źródło
Kolejny łatwy sposób ... używając UPDATE IGNORE:
Musisz użyć indeksu dla jednej lub więcej kolumn (indeks typu). Utwórz nową tymczasową kolumnę odniesienia (nie będącą częścią indeksu). W tej kolumnie oznaczasz unikaty w, aktualizując je klauzulą ignore. Krok po kroku:
Dodaj tymczasową kolumnę odniesienia, aby oznaczyć unikatów:
=> to doda kolumnę do twojej tabeli.
Zaktualizuj tabelę, spróbuj oznaczyć wszystko jako unikalne, ale zignoruj możliwe błędy spowodowane problemem zduplikowanego klucza (rekordy zostaną pominięte):
=> odkryjesz, że Twoje zduplikowane rekordy nie zostaną oznaczone jako unikalne = 'Tak', innymi słowy, tylko jeden z każdego zestawu zduplikowanych rekordów zostanie oznaczony jako unikalny.
Usuń wszystko, co nie jest unikalne:
=> Spowoduje to usunięcie wszystkich zduplikowanych rekordów.
Upuść kolumnę ...
źródło
unique
kolumna MUSI zostać dodana do unikalnego ograniczenia razem z kolumnami, które są obecnie zduplikowane, w przeciwnym razie całość nie zadziała, ponieważ SETunique
= 'Yes' nigdy nie zawiedzie.unique
jest to słowo kluczowe mysql. Musi więc mieć znaki grawitacyjne (jak już są poprawnie wyświetlone). Użycie innego słowa na oznaczenie kolumny może być wygodniejsze.Usuwanie duplikatów w tabelach MySQL jest częstym problemem, który zwykle wiąże się z określonymi potrzebami. Jeśli ktoś jest zainteresowany, tutaj ( Usuń zduplikowane wiersze w MySQL ) wyjaśniam, jak używać tabeli tymczasowej do usuwania duplikatów MySQL w niezawodny i szybki sposób, również do obsługi źródeł dużych zbiorów danych (z przykładami dla różnych przypadków użycia).
Ali , w twoim przypadku możesz uruchomić coś takiego:
źródło
źródło
Odpowiedź Love @ eric, ale wydaje się nie działać, jeśli masz naprawdę duży stół (dostaję,
The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay
gdy próbuję go uruchomić). Więc ograniczyłem zapytanie sprzężenia do rozważenia tylko zduplikowanych wierszy i otrzymałem:Klauzula WHERE w tym przypadku umożliwia MySQL ignorowanie każdego wiersza, który nie ma duplikatu, a także ignoruje, jeśli jest to pierwsza instancja duplikatu, więc tylko kolejne duplikaty będą ignorowane. Zmień
MIN(baz)
na,MAX(baz)
aby zachować ostatnią instancję zamiast pierwszej.źródło
Działa to w przypadku dużych tabel:
Aby usunąć najstarszą zmianę
max(id)
wmin(id)
źródło
To tutaj spowoduje, że kolumna stanie
column_name
się kluczem podstawowym, a tymczasem zignoruje wszystkie błędy. Więc usunie wiersze ze zduplikowaną wartością dlacolumn_name
.źródło
Myślę, że to zadziała, kopiując tabelę i opróżniając ją, a następnie umieszczając z powrotem tylko odrębne wartości, ale sprawdź to dokładnie przed wykonaniem tego na dużych ilościach danych.
Tworzy kopię Twojego stołu
Opróżnia oryginalny stół
Kopiuje wszystkie odrębne wartości ze skopiowanej tabeli z powrotem do oryginalnej tabeli
Usuwa tabelę tymczasową.
Musisz pogrupować według wszystkich pól, które chcesz rozróżnić.
źródło
źródło
oto jak zwykle eliminuję duplikaty
źródło
Możesz po prostu użyć klauzuli DISTINCT, aby wybrać „wyczyszczoną” listę (a tutaj jest bardzo prosty przykład, jak to zrobić).
źródło
DISTINCT
Ciebie powoduje utratę wszelkich informacji o duplikatach, które mogłeś mieć w pierwszej kolejności. Czy możesz pokazać sposób usuwania duplikatów za jego pomocą?Czy to zadziała, jeśli je policzysz, a następnie dodasz ograniczenie do zapytania usuwającego, pozostawiając tylko jedno?
Na przykład, jeśli masz dwa lub więcej, napisz zapytanie w ten sposób:
źródło
Aby usunąć zduplikowane dane z tabeli, wystarczy wykonać kilka podstawowych czynności:
Oto pełny samouczek: https://blog.teamsql.io/deleting-duplicate-data-3541485b3473
źródło