Vores rejse til MySQL startede med CREATE TABLE efterfulgt af INSERT. I dag går vi videre til MySQL DELETE-erklæringen. Det er næsten lige så almindeligt som MySQL UPDATE-sætningen.
Da du er fortrolig med T-SQL DELETE, er målet at gøre dig mere produktiv ved at bruge MySQL-syntaksen. Der er mindre forskelle i disse DELETE-udsagn, men der er ikke noget, du ikke kan håndtere. Lad os komme i gang.
Forberedelse af prøvedataene
Et af de mest almindelige behov er MySQL delete row opgaven. Vi vil undersøge det her, men først skal vi forberede vores arbejdsområde. For at slette eventuelle poster skal vi først have dem. Lad os derfor bygge en database i MySQL.
Jeg føler mig nostalgisk over tv-serier fra 80'erne, så jeg vil bruge episoder fra MacGyver og Quantum Leap til eksempeldata. Jeg har den endelige Excel-fil til at importere dataene til en ny database. Denne fil har 2 ark med navnet Titler og Afsnit . Vi importerer dem begge til to tabeller.
Før vi importerer data, bør vi komme med en database ved navn tv-serier med to tabeller kaldet Titler og Afsnit . MySQL-oprettelsestabeljobbet er elementært med det rigtige værktøj. Jeg bruger dbForge Studio til MySQL, og de følgende figurer 1 og 2 viser den visuelle tabelstruktur af min database præsenteret af det værktøj.
Scriptet til tabellerne er nedenfor:
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);
Efter at have oprettet databasen og tabellerne, kan vi importere vores data fra Excel-filen.
Det mest ligetil og kraftfulde værktøj, jeg brugte til at importere Excel-filer til MySQL, er dbForge Studio til MySQL. Jeg sætter især pris på tilføjelsen af en ny kolonne som en primær nøgle i måltabellen. Også formatet til automatisk registrering af dato og klokkeslæt er god støtte. Det konverterer datoer med en tekstdatatype og mærkelige datoformater uden besvær.
Da vi skal sammenligne MySQL-syntaksen med T-SQL, kan du også importere Excel-filen til en ny database på SQL Server. Brug derefter de samme database- og tabelnavne som i MySQL.
Flere oplysninger
- MySQL-import- og eksportværktøj i dbForge Studio til MySQL
1. Slet alle data fra tabellen
For det første det nemmeste. Lad os prøve at sikkerhedskopiere afsnittene tabel og derefter slette registreringerne af sikkerhedskopien. Vi udfører standard MySQL sletning af alle rækker operation, som du muligvis skal udføre i forskellige situationer.
CREATE TABLE episodes_backup AS
SELECT * FROM episodes;
DELETE FROM episodes_backup;
Som du kan se, er syntaksen den samme som for T-SQL. Forespørgslen vil slette alle poster i episodes_backup tabel.
Et par bemærkninger til dig:
- Hvis du har brug for at slette flere rækker eller alle rækker, er TRUNCATE TABLE hurtigere end DELETE uden en WHERE-sætning. Dette gælder både for MySQL og SQL Server.
- Hvis du udfører ovenstående kode i MySQL Workbench, udløses en fejlkode 1175 . Det er ikke tilladt, fordi MySQL Workbench som standard indstiller til sikker tilstandsopdatering. En sletning eller opdatering af en tabel uden en WHERE-sætning er således ikke tilladt. Alligevel kan du deaktivere denne funktion i Præferencer .
2. Slet WHERE i MySQL
Det andet punkt handler om at bruge DELETE med en betingelse, MySQL-sletningen fra select-operationen. På denne måde kan du slette en eller flere poster i en enkelt erklæring, men ikke dem alle. Slet f.eks. første række eller andre specifikke rækker. Hvad hvis du leder efter en måde at undgå duplikerede poster i SQL? Brug af WHERE-tilstanden ville være løsningen.
Igen er syntaksen den samme i 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);
Ikke noget ekstraordinært her, men næste afsnit bliver anderledes.
3. MySQL DELETE LIMIT
BEGRÆNSE? Hvilken LIMIT?
LIMIT svarer til TOP i T-SQL. Før vi har et DELETE-eksempel, lad os forespørge på poster, vi skal slette. Tjek koden nedenfor:
SELECT * FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;
Her er din LIMIT. Det vil resultere i 2 poster som vist i figur 3 for kortvisningen i dbForge Studio til MySQL:
Lad os nu prøve at slette dem. Tag et kig på eksemplet nedenfor:
DELETE FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;
Inden de slettede 2 afsnit, forespurgte MySQL alle afsnit fra 1987. Derefter sorterede den dem i sæson- og afsnitsnumre. Endelig begrænsede det resultaterne til 2 poster. Det er også en velegnet metode, når vi skal slette duplikerede rækker. Det lader os specificere betingelserne for sletning og sikre, at vi ikke sletter noget nødvendigt (men at lave en sikkerhedskopi vil stadig give datasikkerheden).
Er der en T-SQL-ækvivalent? Tror du, det vil virke?
DELETE TOP (2) FROM episodes
WHERE year(AirDate) = 2020
ORDER BY SeasonNo, EpisodeNo
GO
Hvis du indsætter ovenstående kode i SQL Server Management Studio, får du snoede linjer i ORDER BY-klausulen. Alligevel er TOP tilladt.
Hvis du fjerner ORDER BY-klausulen, vil din forespørgsel dog slette 2 tilfældige poster. Endelig vil ovenstående kode ikke køre som forventet.
For at få det samme resultat som i MySQL skal du bruge følgende kode:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo)
Det er lidt længere i T-SQL end i MySQL. Men der er mere.
4. MySQL DELETE med JOIN
En anden måde at slette poster på er at bruge den med en JOIN, der filtrerer poster, du vil slette. Som mange brugere definerer det, er det MySQL delete join-opgaven. Intet ser anderledes ud, når du ikke bruger et tabelalias. Tjek eksemplet nedenfor:
DELETE episodes
FROM episodes
INNER JOIN titles ON titles.TitleID = episodes.TitleID
WHERE titles.TitleID = 3
AND episodes.SeasonNo = 3;
Dette vil også fungere i T-SQL. Men hvis vi bruger et tabelalias som dette:
DELETE episodes
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;
MySQL vil give en fejl. Den korrekte syntaks er nedenfor:
DELETE e
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;
Bemærk forskellen!
5. Slet underforespørgsel i MySQL
Til sidst prøver vi at bruge underforespørgsler. Det er en anden måde at filtrere poster, du vil slette. Du har allerede set eksemplet tidligere, men lad os få det igen:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo)
Dette er perfekt gyldig syntaks i T-SQL. Men vil det virke i MySQL? Lad os ændre det lidt:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM Episodes
WHERE YEAR(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2);
Ups! Det ser ud til, at vi ramte muren. Her er hvad MySQL siger:
Denne version af MySQL understøtter endnu ikke "LIMIT &IN/ALL/ANY/SOME underforespørgsel"
Hvad hvis vi fjerner søgeordet LIMIT? Det udløser endnu en fejl:
Du kan ikke angive måltabellen "episoder" for en opdatering i FROM-klausulen.
Er der en løsning? Ændring af koden til en indlejret underforespørgsel vil køre fint:
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)
Det burde gøre det. Men lad os få et mere fornuftigt eksempel:
DELETE FROM episodes
WHERE TitleID IN
(SELECT TitleID FROM titles
WHERE `From` BETWEEN 1995 AND 2000);
Hvad er nu problemet med disse eksempler? Lad os se:
- MySQL accepterer ikke DELETE-sætningen med et underforespørgselsfilter, der bruger søgeordet LIMIT. Ikke endnu.
- MySQL accepterer ikke DELETE fra måltabellen svarende til underforespørgselstabellen, der filtrerer den.
[sendpulse-form id="13566″]
Konklusion
Så langt så godt. Du har tre DELETE-syntakssammenligninger for MySQL og T-SQL. Jeg håber, at den tredje rate også vil være nyttig for dig i fremtiden.
Dette indlæg fremhævede MySQL-syntaksen ved sletning
- Alle poster,
- 1 eller flere poster med en WHERE-sætning,
- Ved brug af LIMIT,
- Ved brug af JOIN,
- Brug af underforespørgsler.
Du kan nemt se måderne for MySQL-sletningskolonneopgaveydelsen eller slette enhver række, flere rækker og specifikke poster efter betingelser.
Hvis du kunne lide dette opslag, er du velkommen til at dele det på dine foretrukne sociale medieplatforme. Fortæl os også, hvad du synes, i kommentarfeltet nedenfor.