Jak MySQL odstraní duplicitní řádky

How Mysql Delete Duplicate Rows



MySQL je relační datová sada, která ukládá data do tabulek, které mají řádky a sloupce. Data uložená v databázi však mohou obsahovat duplicitní hodnoty způsobené chybami v aplikacích nebo uživatelích.

V tomto tutoriálu se naučíme, jak odstranit duplicitní řádky v databázi MySQL, zmenšit velikost databáze a pomoci zvýšit výkon serveru.







Než budeme pokračovat, předpokládáme:



  1. Ve vašem systému máte nainstalovanou a spuštěnou MySQL
  2. K databázi máte přístup root.
  3. Máte přístup k databázi pro experimentování nebo testování

POZNÁMKA : Pokud potřebujete ukázkovou databázi k vyzkoušení konceptů uvedených v této příručce, zvažte prosím databázi Sakila nebo si stáhněte kopii databáze použité v této příručce.



Zdroje jsou uvedeny níže:





Základní použití

Než začneme, záměrně vytvoříme tabulku obsahující duplicitní hodnoty pro účely testování. Níže jsou uvedeny dotazy SQL k provedení této akce:

POUŽITÍ svět;
UPUSTIT STŮL LI EXISTUJE uživatelé;
VYTVOŘIT STŮL uživatelé(id INT PRIMÁRNÍ KLÍČ NE NULA AUTO_INCREMENT ,uživatelské jméno VARCHAR (10) NE NULA ,celé jméno VARCHAR (dvacet),e-mailem VARCHAR (255) NE NULA );
VLOŽIT DO uživatelé(uživatelské jméno,celé jméno,e-mailem) HODNOTY
('Panna', 'Claude M. Mori', '[email protected]'),
('lis', 'Tiffany G. Bailey', '[email protected]'),
('raketa', 'Christopher S. Payton', '[email protected]'),
('temná hmota', 'Patricia J. Fox', '[email protected]'),
('předmět', 'Faye H. Hartley', '[email protected]'),
('temná hmota', 'Patricia J. Fox', '[email protected]'),
('raketa', 'Christopher S. Payton', '[email protected]'),
('artemis', 'Wesley C. Dillard', '[email protected]');

Neváhejte upravit výše uvedený dotaz, aby vyhovoval vašim potřebám. Měli byste také zajistit, abyste měli databázi (svět) vytvořenou, abyste se vyhnuli chybám.



Nyní, pokud dostaneme všechna data do tabulky a v pořadí podle uživatelského jména, uvidíme duplikáty, které máme, jak je uvedeno:

mysql> použití svět;
Databáze změnil
mysql> VYBRAT * Z uživatelé SEŘADIT PODLE uživatelské jméno;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|uživatelské jméno|celé jméno|e-mailem|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[chráněno emailem]|
| 4 |temná hmota|Patricia J. Fox|[chráněno emailem]|
| 6 |temná hmota|Patricia J. Fox|[chráněno emailem]|
| 2 |lis|Tiffany G. Bailey|[chráněno emailem]|
| 5 |předmět|Faye H. Hartley|[chráněno emailem]|
| 3 |raketa|Christopher S. Payton|[chráněno emailem]|
| 7 |raketa|Christopher S. Payton|[chráněno emailem]|
| 1 |Panna|Claude M. Mori|[chráněno emailem]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Jak vidíte z výše uvedené tabulky, máme dvě duplicitní hodnoty, které bez důvodu zvětšují databázi a způsobují nízké rychlosti.

Pojďme se nyní naučit, jak můžeme tyto hodnoty odstranit.

#1 - ODSTRANIT PŘIPOJTE SE

Jedním ze způsobů, jak odstranit duplicitní řádky v databázi, je použít příkaz MySQL DELETE JOIN. Dotaz však používá ID k odstranění duplicitních hodnot.

Chcete -li například odstranit duplicitní hodnoty v tabulce uživatelů výše, můžeme zadat:

VYMAZAT stůl 1 Z tabulka uživatelů 1 VNITŘNÍ PŘIPOJIT tabulka uživatelů2 KDE tabulka1.id<tabulka2.id A tabulka 1. e -mail=tabulka2.email;

Jakmile provedete výše uvedený dotaz, odeberete duplicitní hodnoty, jak je uvedeno v níže uvedeném výstupu:

mysql> VYMAZAT stůl 1 Z tabulka uživatelů 1 VNITŘNÍ PŘIPOJIT tabulka uživatelů2 KDE tabulka1.id<tabulka2.id A tabulka 1. e -mail=tabulka2.email;
Dotaz OK, 2ovlivněné řádky(0,01sek)

mysql> VYBRAT * Z uživatelé SEŘADIT PODLE uživatelské jméno;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|uživatelské jméno|celé jméno|e-mailem|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[chráněno emailem]|
| 6 |temná hmota|Patricia J. Fox|[chráněno emailem]|
| 2 |lis|Tiffany G. Bailey|[chráněno emailem]|
| 5 |předmět|Faye H. Hartley|[chráněno emailem]|
| 7 |raketa|Christopher S. Payton|[chráněno emailem]|
| 1 |Panna|Claude M. Mori|[chráněno emailem]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

#2 - Funkce Row_Number ()

Druhou metodou, kterou můžeme implementovat, je použít funkci MySQL row_number (). Tato funkce je podporována v MySQL verze 8 a vyšší.

Funguje to tak, že každému řádku přiřadíte sekvenční hodnotu int, přičemž řádky obsahující duplicitní hodnoty získají hodnotu vyšší než 1.

Chcete -li se dozvědět více o této funkci, použijte níže uvedený zdroj:

https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_row-number

Zvažte níže uvedený dotaz, který vrací ID řádků s duplicitními hodnotami:

VYBRAT id Z ( VYBRAT id,ŘADA_NUMBER()PŘES( ROZDĚLIT POD uživatelským jménem SEŘADIT PODLE uživatelské jméno) TAK JAKO řádek_var Z uživatelé)t1 KDE řádek_var> 1;

Jakmile spustíte výše uvedený dotaz, měli byste získat seznam ID, jak je uvedeno v níže uvedeném výstupu:

+ ---- +
|id|
+ ---- +
| 6 |
| 7 |
+ ---- +
2řádky v soubor (0,01sek)

Pokud chcete hodnoty odebrat, jednoduše nahraďte příkaz SELECT příkazem DELETE, jak je uvedeno níže:

VYMAZAT Z uživatelé KDE id V ( VYBRAT id Z ( VYBRAT id,ŘADA_NUMBER()PŘES( ROZDĚLIT POD uživatelským jménem SEŘADIT PODLE uživatelské jméno) TAK JAKO řádek_var Z uživatelé)t1 KDE řádek_var> 1);

Nakonec můžete pomocí příkazu SELECT ověřit, že jsou odstraněny duplicitní hodnoty.

mysql> VYBRAT * z uživatelé SEŘADIT PODLE uživatelské jméno;
+ ---- + ------------ + ----------------------- + ------- ---------------- +
|id|uživatelské jméno|celé jméno|e-mailem|
+ ---- + ------------ + ----------------------- + ------- ---------------- +
| 8 |artemis|Wesley C. Dillard|[chráněno emailem]|
| 4 |temná hmota|Patricia J. Fox|[chráněno emailem]|
| 2 |lis|Tiffany G. Bailey|[chráněno emailem]|
| 5 |předmět|Faye H. Hartley|[chráněno emailem]|
| 3 |raketa|Christopher S. Payton|[chráněno emailem]|
| 1 |Panna|Claude M. Mori|[chráněno emailem]|
+ ---- + ------------ + ----------------------- + ------- ---------------- +

Závěr

V tomto kurzu jsme diskutovali o dvou metodách odebrání duplicitních hodnot z databáze. Velké databáze, zejména běžně používané, mohou obsahovat mnoho duplicitních hodnot z externích importů a dalších chyb. Proto je třeba neustále odstraňovat duplicitní hodnoty, aby bylo zajištěno optimální fungování aplikací.