Naše cesta k MySQL začala CREATE TABLE následovanou INSERT. Dnes přistoupíme k příkazu MySQL DELETE. Je téměř tak běžný jako příkaz MySQL UPDATE.
Protože jste obeznámeni s T-SQL DELETE, cílem je zvýšit vaši produktivitu pomocí syntaxe MySQL. V těchto příkazech DELETE jsou drobné rozdíly, ale není nic, co byste nezvládli. Začněme.
Příprava ukázkových dat
Jednou z nejběžnějších potřeb je úloha odstranění řádku MySQL. Prozkoumáme to zde, ale nejprve musíme připravit naši pracovní oblast. Abychom mohli odstranit jakékoli záznamy, musíme je nejprve mít. Pojďme tedy vytvořit databázi v MySQL.
Cítím nostalgii kvůli televizním seriálům z 80. let, takže pro ukázková data použiji epizody z MacGyvera a Quantum Leap. Mám konečný soubor Excel pro import dat do nové databáze. Tento soubor má 2 listy s názvem Tituly a Epizody . Oba je importujeme do dvou tabulek.
Před importem dat bychom měli přijít s databází s názvem tv-series se dvěma tabulkami nazvanými Tituly a epizody . Úloha vytvoření tabulky MySQL je se správným nástrojem základní. Používám dbForge Studio pro MySQL a následující obrázky 1 a 2 zobrazují strukturu vizuální tabulky mé databáze prezentovanou tímto nástrojem.
Skript pro tabulky je níže:
CREATE DATABASE IF NOT EXISTS `tv-series`;
USE `tv-series`;
CREATE TABLE `tv-series`.titles (
TitleID int NOT NULL AUTO_INCREMENT,
Title varchar(50) DEFAULT NULL,
`From` int DEFAULT NULL,
`To` int DEFAULT NULL,
PRIMARY KEY (TitleID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 3,
AVG_ROW_LENGTH = 8192,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;
CREATE TABLE `tv-series`.episodes (
EpisodeID int NOT NULL AUTO_INCREMENT,
TitleID int DEFAULT NULL,
EpisodeTitle varchar(100) DEFAULT NULL,
AirDate date DEFAULT NULL,
Synopsis text DEFAULT NULL,
EpisodeNo int NOT NULL,
SeasonNo int NOT NULL,
PRIMARY KEY (EpisodeID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 160,
AVG_ROW_LENGTH = 414,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE `tv-series`.episodes
ADD INDEX IDX_episodes_TitleID (TitleID);
Po vytvoření databáze a tabulek můžeme importovat naše data ze souboru Excel.
Nejpřímější a nejvýkonnější nástroj, který jsem použil k importu souborů Excel do MySQL, je dbForge Studio pro MySQL. Oceňuji především přidání nového sloupce jako primárního klíče do cílové tabulky. Velkou podporou je také formát data a času s automatickou detekcí. Převádí data pomocí textového datového typu a podivných formátů data bez potíží.
Protože se chystáme porovnat syntaxi MySQL s T-SQL, můžete také importovat soubor Excel do nové databáze na SQL Server. Poté použijte stejné názvy databáze a tabulek jako v MySQL.
Další informace
- Nástroj pro import a export MySQL v dbForge Studio for MySQL
1. Smazat všechna data z tabulky
Za prvé, nejjednodušší. Zkusme zálohovat epizody tabulky a poté vymažte záznamy zálohy. Provedeme standardní operaci MySQL s vymazáním všech řádků, kterou možná budete muset provést v různých situacích.
CREATE TABLE episodes_backup AS
SELECT * FROM episodes;
DELETE FROM episodes_backup;
Jak vidíte, syntaxe je stejná jako u T-SQL. Dotaz odstraní všechny záznamy v epizodes_backup tabulka.
Několik poznámek pro vás:
- Pokud potřebujete odstranit více řádků nebo všechny řádky, je TRUNCATE TABLE rychlejší než DELETE bez klauzule WHERE. To platí pro MySQL i SQL Server.
- Spuštění výše uvedeného kódu v MySQL Workbench spustí Kód chyby 1175 . Není to povoleno, protože MySQL Workbench má výchozí aktualizaci v nouzovém režimu. Odstranění nebo aktualizace tabulky bez klauzule WHERE tedy není povolena. Tuto funkci však můžete zakázat v Předvolbách .
2. Smazat WHERE v MySQL
Druhý bod je o použití DELETE s podmínkou, operace MySQL delete from select. Tímto způsobem můžete odstranit jeden nebo více záznamů v jednom výpisu, ale ne všechny. Například odstraňte první řádek nebo jiný konkrétní řádek/řádky. Co když hledáte způsob, jak se vyhnout duplicitním záznamům v SQL? Řešením by bylo použití podmínky WHERE.
Syntaxe je opět stejná v T-SQL:
-- Delete 1 record using an equality operator
DELETE FROM episodes
WHERE EpisodeID = 150;
-- Delete 3 records using IN
DELETE FROM episodes
WHERE EpisodeID IN (151,152,153);
Není zde nic mimořádného, ale další sekce bude jiná.
3. MySQL DELETE LIMIT
OMEZIT? Jaký LIMIT?
LIMIT je ekvivalentní TOP v T-SQL. Než budeme mít příklad DELETE, podívejme se na záznamy, které se chystáme odstranit. Podívejte se na kód níže:
SELECT * FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;
Zde je váš LIMIT. Výsledkem budou 2 záznamy, jak je znázorněno na obrázku 3 pro zobrazení karty v dbForge Studio pro MySQL:
Nyní je zkusme odstranit. Podívejte se na příklad níže:
DELETE FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;
Před smazáním 2 epizod se MySQL dotázal na všechny epizody z roku 1987. Poté je roztřídil podle čísel sezón a epizod. Nakonec omezil výsledky na 2 záznamy. Je to také vhodná metoda, když potřebujeme odstranit duplicitní řádky. Umožňuje nám specifikovat podmínky pro smazání a ujistit se, že nesmažeme nic potřebného (ale záloha by i tak zajistila bezpečnost dat).
Existuje ekvivalent T-SQL? Myslíte, že to bude fungovat?
DELETE TOP (2) FROM episodes
WHERE year(AirDate) = 2020
ORDER BY SeasonNo, EpisodeNo
GO
Pokud výše uvedený kód vložíte do SQL Server Management Studio, v klauzuli ORDER BY se zobrazí klikaté řádky. Přesto je TOP povoleno.
Pokud však odstraníte klauzuli ORDER BY, váš dotaz smaže 2 náhodné záznamy. Nakonec výše uvedený kód nepoběží podle očekávání.
Chcete-li mít stejný výsledek jako v MySQL, potřebujete následující kód:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo)
V T-SQL je o něco delší než v MySQL. Ale je toho víc.
4. MySQL DELETE with JOIN
Dalším způsobem, jak odstranit záznamy, je použití s JOIN, který bude filtrovat záznamy, které chcete odstranit. Jak to definuje mnoho uživatelů, jedná se o úkol MySQL delete join. Nic nevypadá jinak, když nepoužíváte alias tabulky. Podívejte se na příklad níže:
DELETE episodes
FROM episodes
INNER JOIN titles ON titles.TitleID = episodes.TitleID
WHERE titles.TitleID = 3
AND episodes.SeasonNo = 3;
To bude fungovat i v T-SQL. Ale pokud použijeme alias tabulky, jako je tento:
DELETE episodes
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;
MySQL vyvolá chybu. Správná syntaxe je níže:
DELETE e
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;
Všimněte si rozdílu!
5. Odstranit poddotaz v MySQL
Nakonec zkusíme použít poddotazy. Je to jiný způsob filtrování záznamů, které chcete odstranit. Příklad jste již viděli dříve, ale zopakujme si ho:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo)
Toto je dokonale platná syntaxe v T-SQL. Ale bude to fungovat v MySQL? Pojďme to trochu změnit:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2);
Jejda! Vypadá to, že jsme narazili do zdi. Zde je to, co říká MySQL:
Tato verze MySQL zatím nepodporuje poddotaz „LIMIT &IN/ALL/ANY/SOME“
Co když odstraníme klíčové slovo LIMIT? Vyvolá to další chybu:
Nemůžete určit cílovou tabulku „epizody“ pro aktualizaci v klauzuli FROM.
Existuje nějaké řešení? Změna kódu na vnořený poddotaz poběží v pohodě:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM (SELECT EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 5) AS T)
To by mělo stačit. Ale uveďme rozumnější příklad:
DELETE FROM episodes
WHERE TitleID IN
(SELECT TitleID FROM titles
WHERE `From` BETWEEN 1995 AND 2000);
Co je na těchto příkladech důležité? Podívejme se:
- MySQL nepřijme příkaz DELETE s filtrem poddotazů pomocí klíčového slova LIMIT. Ještě ne.
- MySQL nepřijme DELETE z cílové tabulky rovnající se tabulce poddotazů, která ji filtruje.
[sendpulse-form id=”13566″]
Závěr
Zatím je vše dobré. Máte tři porovnání syntaxe DELETE pro MySQL a T-SQL. Doufám, že i třetí díl vám bude v budoucnu užitečný.
Tento příspěvek zdůraznil syntaxi MySQL při mazání
- Všechny záznamy,
- 1 nebo více záznamů s klauzulí WHERE,
- Pomocí LIMIT,
- Pomocí funkce JOIN
- Pomocí dílčích dotazů.
Můžete snadno vidět způsoby výkonu úlohy MySQL smazat sloupec nebo odstranit libovolný řádek, více řádků a konkrétní záznamy podle podmínek.
Pokud se vám tento příspěvek líbil, neváhejte jej sdílet na svých oblíbených platformách sociálních médií. Dejte nám také vědět, co si myslíte v sekci Komentáře níže.