Onze reis naar MySQL begon met CREATE TABLE gevolgd door INSERT. Vandaag gaan we verder met de MySQL DELETE-instructie. Het is bijna net zo gewoon als de MySQL UPDATE-instructie.
Aangezien u bekend bent met T-SQL DELETE, is het doel om u productiever te maken met behulp van de MySQL-syntaxis. Er zijn kleine verschillen in deze DELETE-instructies, maar er is niets dat u niet aankan. Laten we beginnen.
De voorbeeldgegevens voorbereiden
Een van de meest voorkomende behoeften is de MySQL-taak voor het verwijderen van rijen. We zullen het hier onderzoeken, maar eerst moeten we ons werkgebied voorbereiden. Om records te verwijderen, hebben we ze eerst nodig. Laten we dus een database bouwen in MySQL.
Ik heb nostalgische gevoelens over tv-series uit de jaren '80, dus ik ga afleveringen van MacGyver en Quantum Leap gebruiken voor voorbeeldgegevens. Ik heb het definitieve Excel-bestand om de gegevens in een nieuwe database te importeren. Dit bestand heeft 2 bladen met de naam Titels en Afleveringen . We zullen ze allebei in twee tabellen importeren.
Voordat we gegevens importeren, moeten we een database bedenken met de naam tv-series met twee tabellen genaamd Titels en Afleveringen . De MySQL-tabeltaak is elementair met de juiste tool. Ik gebruik dbForge Studio voor MySQL en de volgende afbeeldingen 1 en 2 geven de visuele tabelstructuur weer van mijn database die door die tool wordt gepresenteerd.
Het script voor de tabellen staat hieronder:
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);
Nadat we de database en tabellen hebben gemaakt, kunnen we onze gegevens importeren uit het Excel-bestand.
De meest eenvoudige en krachtige tool die ik heb gebruikt om Excel-bestanden naar MySQL te importeren, is dbForge Studio voor MySQL. Ik waardeer vooral de toevoeging van een nieuwe kolom als primaire sleutel in de doeltabel. Ook is het autodetect datum- en tijdformaat geweldige ondersteuning. Het converteert datums met een tekstgegevenstype en vreemde datumnotaties zonder gedoe.
Aangezien we de MySQL-syntaxis gaan vergelijken met T-SQL, kunt u het Excel-bestand ook importeren in een nieuwe database op SQL Server. Gebruik dan dezelfde database- en tabelnamen als in MySQL.
Meer informatie
- MySQL-import- en exporttool in dbForge Studio voor MySQL
1. Alle gegevens uit tabel verwijderen
Ten eerste de gemakkelijkste. Laten we proberen een back-up te maken van de Afleveringen tabel en verwijder vervolgens de records van de back-up. We zullen de standaard MySQL-bewerking voor het verwijderen van alle rijen uitvoeren die u mogelijk in verschillende situaties moet doen.
CREATE TABLE episodes_backup AS
SELECT * FROM episodes;
DELETE FROM episodes_backup;
Zoals u ziet, is de syntaxis hetzelfde als voor T-SQL. De query verwijdert alle records in de episodes_backup tafel.
Een paar opmerkingen voor u:
- Als u meerdere rijen of alle rijen moet verwijderen, is TRUNCATE TABLE sneller dan DELETE zonder een WHERE-component. Dit geldt voor zowel MySQL als SQL Server.
- Het uitvoeren van de bovenstaande code in MySQL Workbench zal een Foutcode 1175 activeren . Het is niet toegestaan omdat MySQL Workbench standaard is ingesteld op updates in de veilige modus. Het verwijderen of bijwerken van een tabel zonder een WHERE-clausule is dus niet toegestaan. Toch kunt u deze functie uitschakelen in Voorkeuren .
2. Verwijderen WHERE in MySQL
Het tweede punt gaat over het gebruik van DELETE met een voorwaarde, de MySQL delete from select-bewerking. Op deze manier kunt u een of meer records in één verklaring verwijderen, maar niet allemaal. Verwijder bijvoorbeeld de eerste rij of andere specifieke rij(en). Wat als u op zoek bent naar een manier om dubbele records in SQL te voorkomen? Het gebruik van de WHERE-voorwaarde zou de oplossing zijn.
Nogmaals, de syntaxis is hetzelfde in 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);
Niets bijzonders hier, maar het volgende gedeelte zal anders zijn.
3. MySQL DELETE LIMIT
BEGRENZING? Welke LIMIET?
LIMIT is gelijk aan TOP in T-SQL. Laten we, voordat we een DELETE-voorbeeld hebben, een query uitvoeren op records die we gaan verwijderen. Bekijk de onderstaande code:
SELECT * FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;
Hier is uw LIMIET. Het zal resulteren in 2 records zoals weergegeven in Afbeelding 3 voor de kaartweergave in dbForge Studio voor MySQL:
Laten we nu proberen ze te verwijderen. Bekijk het onderstaande voorbeeld:
DELETE FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;
Alvorens 2 afleveringen te verwijderen, heeft MySQL alle afleveringen van 1987 opgevraagd. Vervolgens sorteerde het ze in seizoen- en afleveringsnummers. Ten slotte beperkte het de resultaten tot 2 records. Het is ook een geschikte methode wanneer we dubbele rijen moeten verwijderen. Hiermee kunnen we de voorwaarden voor verwijdering specificeren en ervoor zorgen dat we niets verwijderen dat nodig is (maar het maken van een back-up zou nog steeds de gegevensveiligheid bieden).
Is er een T-SQL-equivalent? Denk je dat dit zal werken?
DELETE TOP (2) FROM episodes
WHERE year(AirDate) = 2020
ORDER BY SeasonNo, EpisodeNo
GO
Als u de bovenstaande code in SQL Server Management Studio plakt, krijgt u kronkelige lijnen in de ORDER BY-component. Maar TOP is toegestaan.
Als u echter de ORDER BY-component verwijdert, verwijdert uw zoekopdracht 2 willekeurige records. Ten slotte zal de bovenstaande code niet werken zoals verwacht.
Om hetzelfde resultaat te krijgen als in MySQL, heb je de volgende code nodig:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo)
Het is iets langer in T-SQL dan in MySQL. Maar er is meer.
4. MySQL VERWIJDEREN met JOIN
Een andere manier om records te verwijderen, is door het te gebruiken met een JOIN die records filtert die u wilt verwijderen. Zoals veel gebruikers het definiëren, is het de MySQL-taak om samen te voegen. Niets ziet er anders uit als u geen tabelalias gebruikt. Bekijk het onderstaande voorbeeld:
DELETE episodes
FROM episodes
INNER JOIN titles ON titles.TitleID = episodes.TitleID
WHERE titles.TitleID = 3
AND episodes.SeasonNo = 3;
Dit werkt ook in T-SQL. Maar als we een tabelalias als deze gebruiken:
DELETE episodes
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;
MySQL geeft een foutmelding. De juiste syntaxis staat hieronder:
DELETE e
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;
Let op het verschil!
5. Subquery verwijderen in MySQL
Ten slotte proberen we subquery's te gebruiken. Het is een andere manier om records te filteren die u wilt verwijderen. Je hebt het voorbeeld al eerder gezien, maar laten we het nog een keer bekijken:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo)
Dit is een perfect geldige syntaxis in T-SQL. Maar werkt het ook in MySQL? Laten we het een beetje veranderen:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2);
Oeps! Het lijkt erop dat we de muur raken. Dit is wat MySQL zegt:
Deze versie van MySQL ondersteunt nog geen 'LIMIT &IN/ALL/ANY/SOME subquery'
Wat als we het LIMIT-zoekwoord verwijderen? Het activeert een andere fout:
U kunt de doeltabel 'afleveringen' niet specificeren voor een update in de FROM-clausule.
Is er een oplossing? Het wijzigen van de code in een geneste subquery werkt prima:
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)
Dat zou het moeten doen. Maar laten we een verstandiger voorbeeld geven:
DELETE FROM episodes
WHERE TitleID IN
(SELECT TitleID FROM titles
WHERE `From` BETWEEN 1995 AND 2000);
Wat is het probleem met deze voorbeelden? Eens kijken:
- MySQL accepteert de instructie DELETE met een subqueryfilter met het trefwoord LIMIT niet. Nog niet.
- MySQL accepteert geen DELETE uit de doeltabel die gelijk is aan de subquerytabel die deze filtert.
[sendpulse-form id=”13566″]
Conclusie
Tot zover goed. U hebt drie DELETE-syntaxisvergelijkingen voor MySQL en T-SQL. Ik hoop dat de derde aflevering ook in de toekomst nuttig voor u zal zijn.
Dit bericht benadrukte de MySQL-syntaxis bij het verwijderen
- Alle records,
- 1 of meer records met een WHERE-clausule,
- LIMIT gebruiken,
- JoIN gebruiken,
- Subquery's gebruiken.
U kunt eenvoudig de manieren zien waarop de MySQL-kolomtaakprestaties worden verwijderd, of een rij, meerdere rijen en specifieke records op voorwaarden verwijderen.
Als je dit bericht leuk vond, deel het dan gerust op je favoriete sociale mediaplatforms. Laat ons ook weten wat je ervan vindt in het gedeelte Opmerkingen hieronder.