Mam tabelę bazy danych MySQL z dwiema kolumnami, które mnie interesują. Indywidualnie każdy z nich może mieć duplikaty, ale nigdy nie powinien mieć ich duplikatów o tej samej wartości.
stone_id
mogą mieć duplikaty, o ile każdy upsharge
tytuł jest inny i na odwrót. Ale powiedzmy na przykład stone_id
= 412 i upcharge_title
= "szafir", ta kombinacja powinna wystąpić tylko raz.
To jest wporządku:
stone_id = 412 upcharge_title = "sapphire"
stone_id = 412 upcharge_title = "ruby"
To NIE jest w porządku:
stone_id = 412 upcharge_title = "sapphire"
stone_id = 412 upcharge_title = "sapphire"
Czy istnieje zapytanie, które znajdzie duplikaty w obu polach? A jeśli to możliwe, czy istnieje sposób, aby moja baza danych na to nie zezwalała?
Używam MySQL w wersji 4.1.22
źródło
Uznałem, że pomocne jest dodanie niepotrzebnego indeksu przy użyciu opcji „ALTER IGNORE”, która usuwa duplikaty i wymusza unikalne nagrania, które brzmią tak, jak chciałbyś to zrobić. Zatem składnia byłaby następująca:
To skutecznie dodaje unikalne ograniczenie, co oznacza, że nigdy nie będziesz mieć zduplikowanych rekordów, a IGNORE usuwa istniejące duplikaty.
Możesz przeczytać więcej o eh ALTER IGNORE tutaj: http://mediakey.dk/~cc/mysql-remove-duplicate-entries/
Aktualizacja: @Inquisitive poinformował mnie, że może się to nie udać w wersjach MySql> 5.5:
Aktualizacja -
ALTER IGNORE
usunięta w 5.7Z dokumentów
Jeden z deweloperów MySQL podaje dwie alternatywy :
INSERT IGNORE
, np .:Ale w zależności od wielkości stołu może to nie być praktyczne
źródło
Możesz znaleźć takie duplikaty ...
źródło
Aby znaleźć duplikaty:
Aby uniknąć tego w przyszłości, utwórz złożony unikatowy klucz na tych dwóch polach.
źródło
Nawiasem mówiąc, złożone unikalne ograniczenie na stole zapobiegałoby temu w pierwszej kolejności.
(To jest poprawny T-SQL. Nie mam pewności co do MySQL).
źródło
ten post SO pomógł mi, ale ja też chciałem wiedzieć, jak usunąć i zachować jeden z wierszy ... oto rozwiązanie PHP, aby usunąć zduplikowane wiersze i zachować jeden (w moim przypadku były tylko 2 kolumny i jest w funkcja do usuwania powielonych powiązań kategorii)
(limit NUM_DUPES - 1) jest tym, co zachowuje pojedynczy wiersz ...
Dziękuje wszystkim
źródło
ALTER IGNORE TABLE table ADD UNIQUE INDEX index_name(stone_id, charge_title)
usunie zduplikowane wiersze, pozostawiając tylko jedną unikalną parę.