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:
- Ve vašem systému máte nainstalovanou a spuštěnou MySQL
- K databázi máte přístup root.
- 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í.