MySQL
RADERA
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'