sql >> Databáze >  >> RDS >> Mysql

TOP 5 MySQL Delete Syntax s tipy pro vývojáře T-SQL

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:

  1. 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.
  2. 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:

  1. MySQL nepřijme příkaz DELETE s filtrem poddotazů pomocí klíčového slova LIMIT. Ještě ne.
  2. 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.


  1. Neočekávané chování @@rowcount uvnitř UDF v MS SQL 2019

  2. Jak provést INSERT Pass-Through Query v SQL Server

  3. Online migrace z MySQL 5.6 Non-GTID na MySQL 5.7 s GTID

  4. podmíněné jedinečné omezení