Sök…


Syntax

  • DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FRA tabell [WHERE conditions] [ORDER BY expression [ASC | DESC]] [LIMIT number_rows]; /// Syntax för radering av rad (er) från enstaka tabell

parametrar

Parameter detaljer
LÅG PRIORITET Om LOW_PRIORITY tillhandahålls kommer raderingen att försenas tills det inte finns några processer från tabellen
IGNORERA Om IGNORE tillhandahålls ignoreras alla fel som uppstått under raderingen
tabell Tabellen från vilken du kommer att ta bort poster
VAR förhållanden Villkoren som måste uppfyllas för att posterna ska tas bort. Om inga villkor tillhandahålls kommer alla poster från tabellen att raderas
BESTÄLLNING AV uttryck Om ORDER BY tillhandahålls raderas poster i den beställda ordningen
BEGRÄNSA Den kontrollerar det maximala antalet poster som ska raderas från tabellen. Det number_rows raderas.

Radera med var-klausulen

DELETE FROM `table_name` WHERE `field_one` = 'value_one'

Detta raderar alla rader från tabellen där innehållet i field_one för den raden matchar 'value_one'

WHERE klausulen fungerar på samma sätt som en markering, så saker som > , < , <> eller LIKE kan användas.

Observera: Det är nödvändigt att använda villkorade klausuler (WHERE, LIKE) för att ta bort frågan. Om du inte använder några villkorade klausuler kommer alla data från den tabellen att raderas.

Ta bort alla rader från en tabell

DELETE FROM table_name ;

Detta raderar allt, alla rader från tabellen. Det är det mest grundläggande exemplet på syntaxen. Det visar också att DELETE uttalanden verkligen bör användas med extra försiktighet eftersom de kan tömma en tabell, om WHERE klausulen utelämnas.

BEGRÄNSNING raderar

DELETE FROM `table_name` WHERE `field_one` = 'value_one' LIMIT 1

Detta fungerar på samma sätt som exemplet 'Radera med var-klausul', men det kommer att stoppa borttagningen när det begränsade antalet rader har tagits bort.

Om du begränsar rader för radering som denna, ska du vara medveten om att den kommer att radera den första raden som matchar kriterierna. Det kanske inte är det du kan förvänta dig, eftersom resultaten kan komma tillbaka osorterade om de inte uttryckligen beställs.

Radering av flera bord

MySQLs DELETE uttalande kan använda JOIN konstruktionen, vilket också tillåter att ange vilka tabeller som ska raderas från. Detta är användbart för att undvika kapslade frågor. Med tanke på schemat:

create table people
(    id int primary key,
    name varchar(100) not null,
    gender char(1) not null
);
insert people (id,name,gender) values
(1,'Kathy','f'),(2,'John','m'),(3,'Paul','m'),(4,'Kim','f');

create table pets
(    id int auto_increment primary key,
    ownerId int not null,
    name varchar(100) not null,
    color varchar(100) not null
);
insert pets(ownerId,name,color) values 
(1,'Rover','beige'),(2,'Bubbles','purple'),(3,'Spot','black and white'),
(1,'Rover2','white');
id namn kön
1 Kathy f
2 John m
3 Paul m
4 Kim f
id ownerId namn Färg
1 1 Rover beige
2 2 Bubbles lila
4 1 Rover2 vit

Om vi vill ta bort Pauls husdjur, uttalandet

DELETE p2
FROM pets p2
WHERE p2.ownerId in (
    SELECT p1.id
    FROM people p1
    WHERE p1.name = 'Paul');

kan skrivas om som:

DELETE p2    -- remove only rows from pets
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';

1 rad raderad
Spot raderas från husdjur

p1 och p2 är alias för p2 , särskilt användbara för långa tabellnamn och läsbarhet.

Så här tar du bort både personen och husdjuret:

DELETE p1, p2     -- remove rows from both tables
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';

2 rader raderade
Spot raderas från husdjur
Paul raderas från People

utländska nycklar

När DELETE-uttalandet involverar tabeller med en förspänningsknapp begränsar kan optimeringen bearbeta tabellerna i en ordning som inte följer förhållandet. Lägga till exempel en främmande nyckel till definitionen av pets

ALTER TABLE pets ADD CONSTRAINT `fk_pets_2_people` FOREIGN KEY (ownerId) references people(id) ON DELETE CASCADE;

motorn kan försöka ta bort poster från people före pets , vilket orsakar följande fel:

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`pets`, CONSTRAINT `pets_ibfk_1` FOREIGN KEY (`ownerId`) REFERENCES `people` (`id`))

Lösningen i det här fallet är att radera raden från people och lita på InnoDB : s ON DELETE kapacitet för att sprida radering:

DELETE FROM people
WHERE name = 'Paul';

2 rader raderade
Paul raderas från People
Spot raderas på kaskad från Pets

En annan lösning är att tillfälligt inaktivera kontrollen på spetsnycklar:

SET foreign_key_checks = 0;
DELETE p1, p2 FROM people p1 JOIN pets p2 ON p2.ownerId = p1.id WHERE p1.name = 'Paul';
SET foreign_key_checks = 1;

Grundläggande radering

DELETE FROM `myTable` WHERE `someColumn` = 'something'

WHERE klausulen är valfri men utan den raderas alla rader.

RADERA vs TRUNCATE

TRUNCATE tableName;

Detta raderar alla data och återställer AUTO_INCREMENT indexet. Det är mycket snabbare än DELETE FROM tableName på ett enormt datasätt. Det kan vara mycket användbart under utveckling / testning.

När du trunkerar en tabell raderar SQL-servern inte data, den tappar tabellen och återskapar den, varigenom sidorna flyttas så att det finns en chans att återställa den trunkerade informationen innan sidorna skrivs över. (Utrymmet kan inte omedelbart samlas in för innodb_file_per_table=OFF .)

RADERA med flera bord

MySQL tillåter att ange från vilken tabell de matchande raderna måste tas bort

    -- remove only the employees
    DELETE e
    FROM Employees e JOIN Department d ON e.department_id = d.department_id
    WHERE d.name = 'Sales'
    -- remove employees and department
    DELETE e, d
    FROM Employees e JOIN Department d ON e.department_id = d.department_id
    WHERE d.name = 'Sales'
    -- remove from all tables (in this case same as previous)
    DELETE
    FROM Employees e JOIN Department d ON e.department_id = d.department_id
    WHERE d.name = 'Sales'


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow