środa, 19 września 2018

MySQL - Obsługa duplikatów

MySQL - Obsługa duplikatów

Ogólnie tabele lub zestawy wyników czasami zawierają zduplikowane rekordy. Zazwyczaj jest to dozwolone, ale czasami wymagane jest zatrzymanie duplikatów rekordów. Wymagane jest zidentyfikowanie duplikatów rekordów i usunięcie ich z tabeli. W tym rozdziale opisano, jak zapobiegać występowaniu duplikatów rekordów w tabeli i jak usuwać już istniejące duplikaty rekordów.

Zapobieganie powstawaniu duplikatów w tabeli

Możesz użyć klucza PRIMARY KEY lub UNIQUE Index w tabeli z odpowiednimi polami, aby zatrzymać duplikaty rekordów.
Weźmy przykład - Poniższa tabela nie zawiera takiego indeksu lub klucza podstawowego, więc pozwoliłaby na powielenie rekordów dla imie i nazwisko.
CREATE TABLE osoby_tbl (
   imie CHAR(20),
   nazwisko CHAR(20),
   płeć CHAR(10)
);
Aby zapobiec tworzeniu wielu rekordów z tymi samymi wartościami imienia i nazwiska w tej tabeli, dodaj PRIMARY KEY do swojej definicji. Gdy to zrobisz, konieczne jest również zadeklarowanie indeksowania kolumn, które mają wartość NOT NULL , ponieważ PRIMARY KEY nie pozwala na wartości NULL 
CREATE TABLE osoby_tbl (
   imie CHAR(20) NOT NULL,
   nazwisko CHAR(20) NOT NULL,
   płeć CHAR(10),
   PRIMARY KEY (nazwisko, imie)
);
Obecność unikatowego indeksu w tabeli zwykle powoduje błąd, jeśli wstawisz rekord do tabeli, która duplikuje istniejący rekord w kolumnie lub kolumnach, które definiują indeks.
Użyj polecenia INSERT IGNORE zamiast polecenia INSERT. Jeśli rekord nie powiela istniejącego rekordu, MySQL wstawia go jak zwykle. Jeśli rekord jest duplikatem, słowo kluczowe IGNORE nakazuje MySQL, aby odrzucił je w trybie cichym, bez generowania błędu.
Poniższy przykład nie powoduje błędów i jednocześnie nie wstawia również duplikatów.
mysql> INSERT IGNORE INTO osoby_tbl (nazwisko, imie)
   -> VALUES( 'Jan', 'Bolesny');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT IGNORE INTO osoby_tbl (nazwisko, imie)
   -> VALUES( 'Jan', 'Bolesny');
Query OK, 0 rows affected (0.00 sec)

Użyj polecenia REPLACE zamiast polecenia INSERT. Jeśli rekord jest nowy, jest wstawiany tak samo jak z INSERT. Jeśli jest to duplikat, nowy rekord zastępuje stary.
mysql> REPLACE INTO osoby_tbl (nazwisko, imie)
   -> VALUES( 'Alina', 'Komar');
Query OK, 1 row affected (0.00 sec)

mysql> REPLACE INTO osoby_tbl (nazwisko, imie)
   -> VALUES( 'Alina', 'Komar');
Query OK, 2 rows affected (0.00 sec)

Polecenia INSERT IGNORE i REPLACE powinny zostać wybrane zgodnie z zachowaniem dotyczącym duplikowania, które chcesz wykonać. Komenda INSERT IGNORE przechowuje pierwszy zestaw zduplikowanych rekordów i odrzuca pozostałe. Polecenie REPLACE utrzymuje ostatni zestaw duplikatów i usuwa poprzednie.
Innym sposobem na wymuszenie unikalności jest dodanie do tabeli indeksu UNIQUEzamiast klucza PRIMARY.
CREATE TABLE osoby_tbl (
   imie CHAR(20) NOT NULL,
   nazwisko CHAR(20) NOT NULL,
   płeć CHAR(10)
   UNIQUE (nazwisko, imie)
);

Zliczanie i identyfikacja duplikatów

Poniżej znajduje się zapytanie, które zlicza zduplikowane rekordy z kolumn imie i nazwisko w tabeli.
mysql> SELECT COUNT(*) as repetitions, nazwisko, imie
   -> FROM osoby_tbl
   -> GROUP BY nazwisko, imie
   -> HAVING repetitions > 1;
To zapytanie zwróci listę wszystkich duplikatów rekordów w tabeli osoby_tbl. Ogólnie rzecz biorąc, aby zidentyfikować zestawy wartości, które są duplikowane, wykonaj poniższe czynności..
·      Określ, które kolumny zawierają wartości, które mogą być duplikowane.
·      Wymień te kolumny na liście wyboru kolumn wraz z COUNT(*).
·        Lista kolumn również w klauzuli GROUP BY.
·        Dodaj klauzulę HAVING , która eliminuje unikalne wartości, wymagając, aby liczba grup była większa niż jeden.


Eliminacja duplikatów z wyniku kwerendy

Możesz użyć polecenia DISTINCT wraz z instrukcją SELECT, aby znaleźć unikalne rekordy dostępne w tabeli.
mysql> SELECT DISTINCT nazwisko, imie
   -> FROM osoby_tbl
   -> ORDER BY nazwisko;
Alternatywą dla polecenia DISTINCT jest dodanie klauzuli GROUP BY, która określa nazwy kolumn, które wybierasz. Powoduje to usunięcie duplikatów i wybranie tylko unikalnych kombinacji wartości w określonych kolumnach.
mysql> SELECT nazwisko, imie
   -> FROM osoby_tbl
   -> GROUP BY (nazwisko, imie);

Usuwanie duplikatów za pomocą wymiany tabel

Jeśli masz duplikaty rekordów w tabeli i chcesz usunąć wszystkie duplikaty rekordów z tej tabeli, postępuj zgodnie z procedurą podaną poniżej.
mysql> CREATE TABLE tmp SELECT nazwisko, imie, płeć
   ->                  FROM osoby_tbl;
   ->                  GROUP BY (nazwisko, imie);

mysql> DROP TABLE osoby_tbl;
mysql> ALTER TABLE tmp RENAME TO osoby_tbl;

Łatwym sposobem usuwania duplikatów rekordów z tabeli jest dodanie do tej tabeli INDEX lub PRIMARY KEY. Nawet jeśli ta tabela jest już dostępna, możesz użyć tej techniki, aby usunąć duplikaty rekordów, a będziesz bezpieczny również w przyszłości..
mysql> ALTER IGNORE TABLE osoby_tbl
   -> ADD PRIMARY KEY (nazwisko, imie);



Brak komentarzy:

Prześlij komentarz