mysql delete statement delete command syntax
Denna handledning förklarar hur man använder MySQL DELETE-uttalande för att radera data från en tabell eller ta bort hela tabellen och skillnaden mellan avkorta och radera kommandon:
I MySQL är DELETE ett Data Manipulation Language eller DML, som vi vet.
Som namnet själv antyder används kommandot för att radera rader från tabellen. Med detta kommando kan vi radera en eller flera oönskade rader i en enda transaktion. Det finns flera sätt att ta bort poster från en tabell med hjälp av kommandot DELETE.
c ++ binärt trädimplementering
I denna handledning kommer vi att diskutera alla dessa i detalj tillsammans med enkla exempel.
Vad du kommer att lära dig:
- MySQL DELETE-kommando
- Skillnaden mellan TRUNCATE och DELETE-uttalanden
- Referensintegritet och dess inverkan på RADERA
- Vanliga frågor och svar
- Slutsats
MySQL DELETE-kommando
Det finns en viktig faktor att tänka på innan vi går vidare. Alla rader eller flera rader som vi tar bort med kommandot DELETE kan aldrig hämtas.
För att undvika scenarier där en rad raderas av misstag är det tillrådligt att ta en säkerhetskopia av tabellen innan du tar bort DELETE-satsen. Vi kan senare använda den här säkerhetskopian för att återställa tabellen vid eventuella misstag.
Notera: Vi använder MySQL version 8.0. Du kan ladda ner den från här .
MySQL Ta bort syntax:
DELETE (LOW_PRIORITY) (QUICK) (IGNORE) FROM tablename(.*) (, tablename(.*)) (WHERE condition) (ORDER BY) (LIMIT row_count) ;
Syntaxförklaring:
- Syntaxen börjar med nyckelordet ”DELETE FROM” och informerar därmed MySQL-servern om vilken typ av aktivitet som ska utföras. Detta är ett obligatoriskt nyckelord och kan inte utelämnas.
- Därefter kommer namnet på tabellen där DELETE-operationen måste utföras. Detta är också obligatoriskt och kan inte utelämnas. Vi kan nämna ett eller flera bordsnamn här.
- Därefter kan vi nämna alla villkor som styr valbarheten för de rader som ska raderas. Detta är en valfri klausul. Nyckelordet här är VAR.
- Följt av WHERE-satsen är ORDER BY-satsen, som tvingar raderna att raderas i en viss ordning, antingen stigande eller fallande, i en kolumn (er). Detta är en valfri klausul.
- LIMIT-klausulen följer ORDER BY-klausulen. Det sätter en gräns på antalet rader som DELETE-satsen kan ta bort från tabellen.
Modifierare i DELETE Statement
# 1) LOW_PRIORITY:
Denna modifierare informerar MySQL-motorn om att fördröja genomförandet av DELETE-uttalandet till en tidpunkt då det inte finns några anslutningar som läser från tabellen som vi försöker radera från.
Detta hjälper till att uppnå konsekvens mellan alla andra operationer som kommer att utföras på det bordet. Detta hjälper också till att undvika problem med bordlåsning.
# 2) SNABB:
När vi raderar en rad tas motsvarande index också bort. Återhämtning av utrymmet vid tidpunkten för genomförandet av DELETE-satsen tar processortiden. Om vi använder QUICK-nyckelordet förblir motsvarande indexutrymme outnyttjat och kan användas när nya poster som passar indexområdet som raderades tidigare infogas.
Till exempel, överväga en anställdstabell där medarbetar-ID är index. När en anställd lämnar en organisation måste vi ta bort motsvarande post. Om vi använder QUICK-klausulen förblir motsvarande indexutrymme outnyttjat.
När en ny medarbetare ansluter sig får han / hon ett nytt anställdnummer och inte samma antal som den person som lämnade. I sådana exempel är det inte tillrådligt att använda QUICK.
MYSQL DELETE Exempel
Nedan visas en provtabell skapad i MYSQL.
Schemans namn: stilla
Tabellnamn: anställda
Kolumnnamn:
empNum; Innehåller heltalsvärden för anställd.
efternamn: Innehåller varcharvärden för anställdas efternamn.
förnamn: Håller varchar-värden för den anställdas förnamn.
e-post: Håller varchar-värden för den anställdes e-post-ID.
deptNum; Innehåller varchar för avdelnings-ID som en anställd tillhör.
lön: Innehåller decimalvärden för varje anställds lön.
start datum: Innehåller datumvärdena för anställdas anslutningsdatum.
Schemans namn: stilla
Tabellnamn: anställda_historia
Kolumnnamn:
empNum; Innehåller helvärdena för anställd.
efternamn: Innehåller varcharvärden för anställdas efternamn.
förnamn: Håller varchar-värden för den anställdas förnamn.
e-post: Håller varchar-värden för den anställdes e-post-ID.
deptNum; Innehåller varchar för avdelnings-ID som en anställd tillhör.
lön: Innehåller decimalvärden för varje anställds lön.
start datum: Innehåller datumvärden för anställdas anslutningsdatum.
Schemans namn: stilla
Tabellnamn: avdelningar
Kolumnnamn:
deptNum; Innehåller varchar för avdelnings-ID inom en organisation.
stad: Innehåller namnet på staden där avdelningarna arbetar.
Land: Innehåller namnet på det land som motsvarar staden.
bonus: Innehåller procentsatsen för bonusen.
MySQL Ta bort en rad
Det första och enklare sättet att ta bort poster från tabellen för att ta bort poster en efter en, med en mycket stark WHERE-sats som säkerställer att endast en lämplig post raderas. Detta kan vidare användas för att ta bort en uppsättning liknande typer av rader från tabellen.
Låt oss gå igenom borttagningsuttrycket och dess utförande i detalj.
Här försöker vi ta bort en anställd som heter 'Chris Nolan' med anställd nummer 1013.
Som avbildat i bilden ovan har DELETE-uttalandet utförts framgångsrikt och raderat en rad från anställdens bord.
De produktion uttalandet nedan visar den tidpunkt då uttalandet kördes, MySQL-uttalandet som kördes och antalet rader som påverkades.
Var väldigt säker på WHERE-klausulen här. Om WHERE-klausulen är felaktig eller om du missar att ha en WHERE-klausul kan det leda till dataförlust. För att undvika sådana situationer, vid produktion, finns det en praxis med periodisk säkerhetskopiering eller avladdning av data.
För att verifiera utdata från detta DELETE-uttalande, låt oss utföra SELECT-satsen på den här tabellen med empNum som 1013.
Outputresultaten visar NULL-värde för alla kolumner, vilket innebär att det inte finns någon post för ett sådant empNum. Utmatningen av frågan nedan visar att 0 rad (er) har returnerats, vilket antyder att posten har tagits bort genom att utföra DELETE-uttalandet ovan.
Fråga:
DELETE FROM employees WHERE empNum = 1013 ;
Tabell ögonblicksbild efter:
empNum | efternamn | förnamn | e-post | avd | Lön |
---|---|---|---|---|---|
7 | Detta är relativt långsammare än TRUNCATE jämfört för att ta bort hela data från tabellen. | Detta är relativt snabbare än DELETE, jämfört med att ta bort hela data från tabellen. | |||
NULL | NULL | NULL | NULL | NULL | NULL |
MySQL DELETE med ORDER BY och LIMIT-klausul
ORDER BY och LIMIT är två klausuler som vi har diskuterat ovan. Den förstnämnda hjälper till att avgöra i vilken ordning posterna ska rensas, antingen ta bort poster med empNum i stigande eller ta bort poster med lön i fallande ordning. Det senare hjälper till att begränsa antalet poster som denna transaktion kan ta bort.
Till exempel, om vi bara vill ta bort två anställda som hör till avdelning nummer 4, som är höga löntagare. Sedan finns det tre delar till denna fråga.
- Först, vi måste rensa anställda från avdelning nummer 4. Detta kommer att hanteras av en WHERE-klausul.
- Nästa, vi måste rensa anställda som tjänar höga löner. Detta kommer att hanteras av ORDER BY-klausulen i lönekolumnen i fallande ordning.
- Slutligen, vi behöver bara rensa två anställda. Detta hanteras av LIMIT-klausulen.
Låt oss ta en titt på DELETE-frågan och se resultaten. Innan vi gör det, ska vi först identifiera vilka exakta poster vi vill ta bort. Vi kommer att använda ovanstående villkor med ett SELECT-uttalande för att få de poster som vi vill ta bort och senare utföra samma fråga för att verifiera om dessa poster har raderats eller inte.
I ovanstående SELECT-fråga har vi uppfyllt alla de tre villkoren som vi pratade ovan med användning av WHERE, ORDER BY och LIMIT-klausulen. Frågan gav oss två poster, en med empNum 1010 och en annan med 1007. Nu kommer vi att utföra DELETE-frågan för att säkerställa att dessa två poster raderas.
Som avbildad i bilden ovan har DELETE-uttalandet utförts och tagit bort två rader från anställdens tabell. De produktion uttalandet nedan visar den tidpunkt då uttalandet kördes, MySQL-uttalandet som kördes och antalet rader som påverkades.
För att verifiera utdata från detta DELETE-uttalande, låt oss köra SELECT för empNum 1010 och 1007. Vi kan inte använda samma SELECT-fråga som ovan som den som skulle visa de andra anställda under avdelning 4.
bästa molnlagring för stora filer
Outputresultaten visar NULL-värde för alla kolumner, vilket innebär att det inte finns någon post för sådana anställdas nummer. De Produktion i frågan nedan visar att 0 rad (er) har returnerats, vilket antyder att posten har tagits bort genom att utföra DELETE-uttalandet ovan.
Fråga:
DELETE FROM employees WHERE deptNum = 4 ORDER BY salary DESC LIMIT 2 ;
Tabell ögonblicksbild efter:
empNum | efternamn | förnamn | e-post | avd | Lön |
---|---|---|---|---|---|
NULL | NULL | NULL | NULL | NULL | NULL |
MySQL DELETE med Select Clause
Därefter kommer vi att gå igenom användningen av SELECT-klausulen medan vi tar bort poster från en tabell.
Tänk på följande scenario:
Vi har två uppsättningar bord: anställda och avdelningar. deptNum är som en primär nyckel i avdelningens tabell och utländsk nyckel i medarbetarens tabell. Detta innebär att om en anställd tilldelas en avdelning måste den komma från en av avdelningarna i avdelningens tabell.
Nu måste vi ta bort dessa poster från avdelningens tabell där ingen anställd hittills har tilldelats. Vi kan göra detta genom att ha en SELECT-sats i underfrågan till en DELETE-fråga.
Låt oss först identifiera de poster som vi vill ta bort:
Ovanstående SELECT-fråga har en underfråga.
Frågan fungerar som följer:
Frågan hämtar alla poster från avdelningens tabell där deptNum inte finns i medarbetarens tabell. Sammanfogningen utförs i underfrågan i deptNum för de två tabellerna.
Låt oss nu köra DELETE-frågan och se om vi kan ta bort dessa två poster från avdelningens tabell eftersom ingen anställd tilldelas dessa avdelningar.
Som avbildas i bilden ovan har borttagningsuttyget raderat två rader från avdelningstabellerna som ingen anställd har tilldelats.
För att verifiera utdata från detta DELETE-uttalande, låt oss utföra SELECT på bordet och se vad vi har i utdata.
Outputmeddelandet från ovanstående verifieringsfråga säger '0 rad (er) returnerade'. Detta innebär att raderna med avdelning 6 och 7 raderas. Utdata visar också inga poster istället för att visa NULL-värden eftersom poster har raderats.
Fråga:
DELETE FROM departments WHERE NOT EXISTS (SELECT deptNum FROM employees WHERE departments.deptNum = employees.deptNum ) ;
MySQL DELETE Hela data från tabellen
Därefter ska vi titta på scenariot där vi måste ta bort alla rader eller poster från en tabell.
I produktionssituationen kanske du aldrig stöter på en sådan situation. Men den här typen av saker skulle krävas i utvecklingsområdet där du måste testa din kod med flera olika scenarier och du kanske vill skapa en ny uppsättning testdata genom att radera de poster som finns i tabellen.
Låt oss först titta på de data som vi tänker ta bort. Vi försöker ta bort data från tabellen med anställda.
Nedan visas de nuvarande data i tabellen.
Här har vi 18 rader i tabellen med anställda. Låt oss nu ta bort alla dessa i en enda transaktion. Frågan liknar nästan den som vi diskuterade i det första avsnittet. Den enda ändringen är att vi måste ta bort WHERE-klausulen från frågan så att det inte finns några begränsningar för antalet rader som vi vill ta bort.
Som avbildad i bilden ovan har borttagningsuttrycket körts framgångsrikt och raderat alla de 18 raderna från tabellen med anställda_historia. Utdatauttrycket nedan visar den tidpunkt då uttalandet kördes, MySQL-uttalandet som kördes och antalet rader som påverkades.
För att verifiera utdata från detta DELETE-uttalande, låt oss utföra SELECT på bordet och se vad vi har i utdata.
Outputresultaten visar NULL-värde för alla kolumner, vilket innebär att det inte finns någon post för sådana anställdas nummer. Utmatningen av frågan nedan visar att 0 rad (er) har returnerats, vilket antyder att alla poster har raderats genom att ovanstående DELETE-uttalande körs.
Fråga:
DELETE FROM employees_history ;
Tabell ögonblicksbild efter:
empNum | efternamn | förnamn | e-post | avd | Lön |
---|---|---|---|---|---|
NULL | NULL | NULL | NULL | NULL | NULL |
MySQL DELETE Hela tabellen
Nu ska vi titta på scenariot där vi måste ta bort själva tabellen. I SQL-termer kallar vi det DROP-tabellen. Det spelar ingen roll om tabellen har några data eller inte. Det kommer helt enkelt att tappa tabellen tillsammans med data om någon.
I avsnittet ovan har vi raderat data från tabellen med anställda. I det här avsnittet kommer vi att släppa tabellen med anställda_historia.
Följande är kommandot tillsammans med dess utdata:
Som avbildad i ovanstående bild har DROP-uttalandet utförts framgångsrikt och raderat tabellen medarbetarhistorik från systemkatalogen i MySQL-databasen.
Om du tittar på meddelandet kommer det att visas '0 rad (ar) påverkade'. Detta beror på att vi hade tagit bort alla de 18 raderna i föregående avsnitt. Om den här tabellen hade några rader skulle antalet rader påverkas, vilket innebär att de har tagits bort.
För att verifiera utdata från detta DROP-uttalande, låt oss utföra SELECT på bordet och se vad vi har i utdata.
Outputmeddelandet från ovanstående verifieringsfråga säger att tabellen inte finns. Detta validerar vårt utförande av ovanstående DROP-uttalande för att släppa tabellen.
Fråga:
DROP TABLE employees_history ;
MySQL trunkerar kommandot
Vi har redan diskuterat att ta bort alla poster från tabellen med hjälp av kommandot DELETE. Detsamma kan uppnås med TRUNCATE-uttalandet också.
För det här exemplet ska vi återskapa tabellen med anställda_historik och fylla ut den igen med data. T han följer är de två frågor som har utförts för att återskapa tabellen och fylla i den igen:
Fråga:
CREATE TABLE employees_history LIKE employees ; INSERT INTO employees_history (SELECT * FROM employees) ;
Så här ser tabellen anställda_historik ut nu med data.
Därefter tar vi bort alla poster från den här tabellen med hjälp av TRUNCATE-uttalandet.
Som visas på bilden körs frågan framgångsrikt. Om du tittar noga på delen 'Meddelande', skulle du upptäcka att det står '0 rad (ar) påverkade'. Vi vet dock att den här tabellen har 15 rader. Hur kommer det sig att visar noll?
Anledning: Avkortat uttalande bryr sig inte om att räkna hur många rader som påverkas av dess körning. Det tömmer helt enkelt bordet. Detta är en av de signifikanta skillnaderna mellan DELETE och TRUNCATE-uttalanden.
Låt oss verifiera körningen av TRUNCATE-uttalandet genom att utföra en SELECT-fråga på tabellen med anställda.
bästa programmet för att konvertera videofiler
Som visas i bilden ovan har frågan inte returnerat några rader och alla kolumner visar också NULL-värden, vilket antyder att TRUNCATE-uttalandet som vi körde tidigare har raderat alla poster från tabellen.
Fråga:
TRUNCATE TABLE employees_history ;
Skillnaden mellan TRUNCATE och DELETE-uttalanden
Mr. Nej | RADERA | STYMPA |
---|---|---|
1 | Det är ett DML (Data Manipulation Language). | Det är ett DDL (Data Definition Language). |
två | Alla EFTER DELETE-utlösare på bordet aktiveras när vi använder DELETE-kommandot. | Inget EFTER DELETE trigger på bordet aktiveras när vi använder kommandot TRUNCATE. |
3 | En post kan raderas även om det finns några utländska nyckelbegränsningar. | Poster från tabellen kan inte trunkeras om det finns några utländska nyckelbegränsningar. |
4 | Initialisering av tabell kommer inte att ske. | Tabellen återintialiseras. |
5 | VAR klausul kan användas. | WHERE klausul kan inte användas. |
6 | Detta tar bort en post i taget och spårar det totala antalet raderade poster i loggar. | Det rensar alla poster samtidigt och spårar inte antalet raderade poster. |
Referensintegritet och dess inverkan på RADERA
Låt oss se innan vi är vad är referensintegritet eller RI eller begränsningar för främmande nycklar?
Utländska nyckelbegränsningar handlar om att skapa en relation eller koppling mellan föräldern och barnbordet. Detta hjälper till att korsreferera data över tabellerna som är länkade till varandra. En överordnad tabell kan ha flera underordnade tabeller och vice versa.
Till exempel, de två tabeller som vi har diskuterat hittills, dvs. anställda och avdelningar, är länkade till varandra med hjälp av en begränsning av Foreign Key. Denna begränsning fastställs genom att skapa en kolumn, vanligtvis den primära nyckeln, som nyckelkolumnen som länkar två tabeller.
Kolumnen deptNum i avdelningens tabell har länkats till kolumnen deptNum i medarbetarens tabell. I det här fallet är avdelningar överordnat bord och anställda är underordnat bord.
Men hur påverkar detta DELETE-uttalandena?
I MySQL eller i någon databas finns det vissa scenarier som ska hanteras när du tar bort poster från överordnade eller underordnade tabeller.
Det finns flera referensalternativ som vi kan diskutera:
# 1) PÅ RADERA KASKAD: Regeln säger att vi inte kan ta bort en rad från modertabellen om den har några referenser eller har en motsvarande rad i någon av underordnade tabeller. Om en överordnad tabell har en hel del underordnade tabeller är det dock en tråkig uppgift att först ta bort posterna från varje underordnad tabell och sedan från överordnadstabellen.
För detta finns det en lösning som heter, ON DELETE CASCADE. Detta är en klausul som läggs till i CREATE-uttalandet i var och en av de underordnade tabellerna. Så när vi säger att radera en rad från överordnadstabellen, skulle MySQL-motorn först identifiera referenserna för den raden i underordnade tabeller och ta bort dessa poster och till sist kommer posten att tas bort från modertabellen.
# 2) INGEN ÅTGÄRD: Detta är ett standardalternativ. Om körningen av ett DELETE-uttalande försöker ta bort en post som har referenser i någon av de underordnade tabellerna, med detta alternativ kommer körningen av uttalandet att stoppas och MySQL-transaktion kommer att rullas tillbaka till den sista åtagandepunkten.
# 3) BEGRÄNSNING: Funktionen för RESTRICT och NO ACTION är densamma. Det kommer att stoppa körningen och utfärda en återställning.
# 4) SET NULL: Om exekveringen av ett borttagningsuttalande försöker ta bort en post som har referenser i någon av underordnade tabeller, kommer detta alternativ att uppdatera kolumnvärdet i alla underordnade tabeller som NULL. tabell.
# 5) STÄLL IN STANDARD: Om körningen av ett DELETE-uttalande försöker radera en post som har referenser i någon av de underordnade tabellerna, kommer detta alternativ att uppdatera kolumnvärdena till standardvärdet enligt definitionen i CREATE-satsen i tabellen.
Vanliga frågor och svar
F # 1) Hur tar jag bort data från tabellen i MySQL?
Svar: Syntaxen för delete-kommandot för att bara radera en vald rad med data ges nedan.
DELETE FROM table_name WHERE condition;
F # 2) Hur tar jag bort alla data från tabellen i MySQL?
Svar: Syntaxen för DELETE-kommandot för att radera alla rader från tabellen är:
DELETE * FROM table_name;
F # 3) Hur tar jag bort tabellen från databasen i MySQL?
Svar: Drop-kommandot kan användas för att ta bort tabellen från databasen. Användaren kan ersätta tabellnamnet med tabellen som måste tas bort.
DROP TABLE table_name;
F # 4) Hur tar jag bort databasen i MySQL?
Svar: Drop-kommandot kan användas för att radera databasen.
DROP Database db_name;
Användare kan ersätta db_name med databasnamnet som måste raderas.
F # 5) Vad är PÅ RADERA CASCADE i MySQL?
Svar: När överordnadsposten raderas skapar ON DELETE CASCADE en matchande underordnad post som ska raderas. Således är effekten av radering kaskad från föräldern till barnet. Detta kan vara användbart för att utföra radering av flera tabeller.
F # 6) Varför betraktas TRUNCATE som ett DDL-uttalande?
Svar: TRUNCATE-uttalande tappar faktiskt och skapar om bordet tillsammans med metadata för tabellen. Således är det ett DDL-uttalande.
F # 7) Kan TRUNCATE rullas tillbaka?
Svar: Nej, TRUNCATE är ett auto-commit-uttalande om det körs fristående. Det betyder att den inte kan rullas tillbaka eftersom engagemanget också utförs tillsammans med det. Men om det är en del av en transaktion kan den rullas tillbaka med SQL-loggfilerna.
F # 8) Kan RADERA uttalanden rullas tillbaka?
Svar: Ja, DELETE-uttalanden kan rullas tillbaka. Kör bara kommandot ROLLBACK innan du kör COMMIT.
F # 9) Kan en kolumn raderas med kommandot DELETE?
Svar: Kolumntillägg eller radering är DDL-kommandon. Ett ALTER-uttalande bör användas för att DROPA en kolumn från tabellen.
Slutsats
I denna handledning har vi lärt oss olika sätt att köra DELETE-uttalanden i MySQL.
I ett nötskal såg vi:
- MySQL Ta bort en rad
- Ta bort MySQL med ORDER BY And Limit Clause
- MySQL Radera med Select-klausul
- MySQL Ta bort hela tabellen
- MySQL trunkerar
- Skillnad mellan uttalanden TRUNCATE och DELETE
- Referensintegritet och dess inverkan på RADERA
Vi kan använda något av ovanstående baserat på kravet.
Glad läsning!!
Rekommenderad läsning
- Unix Cat Command Syntax, alternativ med exempel
- Unix Sortera kommando med syntax, alternativ och exempel
- MySQL Insert In Table - Insert Statement Syntax & Exempel
- MongoDB uppdatera och ta bort dokument med exempel
- Klipp kommandot i Unix med exempel
- Nytt / Radera operatörer i C ++ med exempel
- MySQL Update Statement Tutorial - Update Query Syntax & Exempel
- Ls Command i Unix med exempel