MySQL
DELETE
Zoeken…
Syntaxis
- VERWIJDER [LOW_PRIORITY] [QUICK] [IGNORE] UIT tabel [WHERE conditions] [ORDER BY expression [ASC | DESC]] [LIMIT aantal_rijen]; /// Syntaxis voor het verwijderen van rij (en) uit één tabel
parameters
Parameter | Details |
---|---|
LAGE PRIORITEIT | Als LOW_PRIORITY is opgegeven, wordt het verwijderen uitgesteld totdat er geen processen meer uit de tabel worden gelezen |
NEGEREN | Als IGNORE wordt opgegeven, worden alle fouten die zich voordoen tijdens het verwijderen genegeerd |
tafel | De tabel waaruit u records gaat verwijderen |
WAAR voorwaarden | De voorwaarden waaraan moet worden voldaan om de records te verwijderen. Als er geen voorwaarden zijn opgegeven, worden alle records uit de tabel verwijderd |
BESTELLEN OP expressie | Als ORDER BY wordt verstrekt, worden records in de opgegeven volgorde verwijderd |
LIMIET | Hiermee wordt het maximale aantal records bepaald dat uit de tabel moet worden verwijderd. Gegeven aantal number_rows worden verwijderd. |
Verwijder met Where-clausule
DELETE FROM `table_name` WHERE `field_one` = 'value_one'
Hiermee worden alle rijen uit de tabel verwijderd waarbij de inhoud van field_one
voor die rij overeenkomt met 'value_one'
De clausule WHERE
werkt op dezelfde manier als een select, dus dingen als >
, <
, <>
of LIKE
kunnen worden gebruikt.
Opmerking: het is noodzakelijk om voorwaardelijke clausules (WAAR, ZOALS) te gebruiken in de verwijderquery. Als u geen voorwaardelijke clausules gebruikt, worden alle gegevens uit die tabel verwijderd.
Verwijder alle rijen uit een tabel
DELETE FROM table_name ;
Hiermee wordt alles, alle rijen uit de tabel verwijderd. Het is het meest basale voorbeeld van de syntaxis. Het laat ook zien dat DELETE
instructies echt met extra zorg moeten worden gebruikt, omdat ze een tabel kunnen leegmaken als de WHERE
clausule wordt weggelaten.
BEPERKEN verwijdert
DELETE FROM `table_name` WHERE `field_one` = 'value_one' LIMIT 1
Dit werkt op dezelfde manier als het voorbeeld 'Verwijderen met waar', maar het verwijderen stopt zodra het beperkte aantal rijen is verwijderd.
Als u rijen beperkt voor verwijdering zoals deze, houd er dan rekening mee dat de eerste rij wordt verwijderd die overeenkomt met de criteria. Het is misschien niet degene die je zou verwachten, omdat de resultaten ongesorteerd terug kunnen komen als ze niet expliciet zijn geordend.
Multi-tafel verwijdert
De DELETE
instructie van MySQL kan het construct JOIN
, waardoor ook kan worden aangegeven uit welke tabellen moet worden verwijderd. Dit is handig om geneste zoekopdrachten te voorkomen. Gezien het schema:
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 kaart | naam | geslacht |
---|---|---|
1 | Kathy | f |
2 | John | m |
3 | Paul | m |
4 | Kim | f |
ID kaart | OwnerID | naam | kleur |
---|---|---|---|
1 | 1 | zwerver | beige |
2 | 2 | Bubbles | Purper |
4 | 1 | Rover2 | wit |
Als we de huisdieren van Paul willen verwijderen, de verklaring
DELETE p2
FROM pets p2
WHERE p2.ownerId in (
SELECT p1.id
FROM people p1
WHERE p1.name = 'Paul');
kan worden herschreven als:
DELETE p2 -- remove only rows from pets
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
1 rij verwijderd
Spot is verwijderd uit huisdieren
p1
en p2
zijn aliassen voor de tabelnamen, vooral handig voor lange tabelnamen en leesbaarheid.
Om zowel de persoon als het huisdier te verwijderen:
DELETE p1, p2 -- remove rows from both tables
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
2 rijen verwijderd
Spot is verwijderd uit huisdieren
Paul is verwijderd uit Mensen
buitenlandse sleutels
Wanneer de instructie DELETE tabellen met een foreing-sleutel beperkt, kan de optimizer de tabellen verwerken in een volgorde die de relatie niet volgt. Het toevoegen van bijvoorbeeld een externe sleutel aan de definitie van pets
ALTER TABLE pets ADD CONSTRAINT `fk_pets_2_people` FOREIGN KEY (ownerId) references people(id) ON DELETE CASCADE;
de motor kan proberen de vermeldingen van people
vóór pets
te verwijderen, waardoor de volgende fout wordt veroorzaakt:
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`))
De oplossing in dit geval is om de rij van people
te verwijderen en te vertrouwen op de ON DELETE
mogelijkheden van InnoDB
om de verwijdering te verspreiden:
DELETE FROM people
WHERE name = 'Paul';
2 rijen verwijderd
Paul is verwijderd uit Mensen
Spot wordt bij cascade uit Huisdieren verwijderd
Een andere oplossing is om de controle op sleutels vooraan tijdelijk uit te schakelen:
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;
Eenvoudig verwijderen
DELETE FROM `myTable` WHERE `someColumn` = 'something'
De WHERE
clausule is optioneel, maar zonder deze worden alle rijen verwijderd.
VERWIJDER versus TRUNCATE
TRUNCATE tableName;
Dit zal verwijderen van alle gegevens en reset AUTO_INCREMENT
index. Het is veel sneller dan DELETE FROM tableName
op een enorme gegevensset. Het kan erg handig zijn tijdens het ontwikkelen / testen.
Wanneer u afkappen een tafel SQL server niet verwijderen van de gegevens, het daalt de tafel en opnieuw aanmaken, waardoor de pagina's deallocating, dus er is een kans om de afgekapt gegevens voordat de pagina's waar overschreven herstellen. (De spatie kan niet onmiddellijk worden terugverdiend voor innodb_file_per_table=OFF
.)
Multi-tafel VERWIJDEREN
Met MySQL kunt u opgeven uit welke tabel de overeenkomende rijen moeten worden verwijderd
-- 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'