MySQL
EFFACER
Recherche…
Syntaxe
- DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table [conditions WHERE] [expression ORDER BY [ASC | DESC]] [LIMIT Number_rows]; /// Syntaxe pour supprimer les lignes de la table unique
Paramètres
Paramètre | Détails |
---|---|
PRIORITÉ BASSE | Si LOW_PRIORITY est fourni, la suppression sera retardée jusqu'à ce qu'il n'y ait plus de processus à lire dans la table. |
IGNORER | Si IGNORE est fourni, toutes les erreurs rencontrées lors de la suppression sont ignorées |
table | La table à partir de laquelle vous allez supprimer des enregistrements |
O conditions conditions | Les conditions à remplir pour que les enregistrements soient supprimés. Si aucune condition n'est fournie, tous les enregistrements de la table seront supprimés. |
Expression ORDER BY | Si ORDER BY est fourni, les enregistrements seront supprimés dans l'ordre indiqué |
LIMITE | Il contrôle le nombre maximal d'enregistrements à supprimer de la table. Les number_rows donnés seront supprimés. |
Supprimer avec la clause Where
DELETE FROM `table_name` WHERE `field_one` = 'value_one'
Cela supprimera toutes les lignes de la table où le contenu de la zone field_one
à cette ligne correspond à 'value_one'.
La clause WHERE
fonctionne de la même manière qu'une sélection, de sorte que des éléments tels que >
, <
, <>
ou LIKE
peuvent être utilisés.
Remarque: il est nécessaire d'utiliser des clauses conditionnelles (WHERE, LIKE) dans la requête de suppression. Si vous n'utilisez aucune clause conditionnelle, toutes les données de cette table seront supprimées.
Supprimer toutes les lignes d'une table
DELETE FROM table_name ;
Cela supprimera tout, toutes les lignes de la table. C'est l'exemple le plus fondamental de la syntaxe. Il montre également que les instructions DELETE
doivent vraiment être utilisées avec précaution car elles peuvent vider une table si la clause WHERE
est omise.
Supprimer les suppressions
DELETE FROM `table_name` WHERE `field_one` = 'value_one' LIMIT 1
Cela fonctionne de la même manière que dans l'exemple de la clause «Delete with Where», mais elle arrêtera la suppression une fois que le nombre limité de lignes aura été supprimé.
Si vous limitez les lignes à supprimer de la sorte, sachez que cela supprimera la première ligne correspondant aux critères. Ce n'est peut-être pas ce à quoi vous vous attendez, car les résultats peuvent être non triés s'ils ne sont pas explicitement commandés.
Suppressions multi-tables
L'instruction DELETE
de MySQL peut utiliser la construction JOIN
, permettant également de spécifier les tables à supprimer. Ceci est utile pour éviter les requêtes imbriquées. Compte tenu du schéma:
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 | prénom | le genre |
---|---|---|
1 | Kathy | F |
2 | John | m |
3 | Paul | m |
4 | Kim | F |
id | ownerId | prénom | Couleur |
---|---|---|---|
1 | 1 | Vagabond | beige |
2 | 2 | Bulles | violet |
4 | 1 | Rover2 | blanc |
Si nous voulons supprimer les animaux de compagnie de Paul, la déclaration
DELETE p2
FROM pets p2
WHERE p2.ownerId in (
SELECT p1.id
FROM people p1
WHERE p1.name = 'Paul');
peut être réécrit comme suit:
DELETE p2 -- remove only rows from pets
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
1 rangée supprimée
Spot est supprimé de Pets
p1
et p2
sont des alias pour les noms de tables, particulièrement utiles pour les noms de tables longues et la facilité de lecture.
Pour retirer à la fois la personne et l'animal de compagnie:
DELETE p1, p2 -- remove rows from both tables
FROM people p1
JOIN pets p2
ON p2.ownerId = p1.id
WHERE p1.name = 'Paul';
2 lignes supprimées
Spot est supprimé de Pets
Paul est supprimé de People
clés étrangères
Lorsque l'instruction DELETE appelle des tables avec une clé externe, l'optimiseur peut traiter les tables dans un ordre qui ne suit pas la relation. Ajouter par exemple une clé étrangère à la définition des pets
de pets
ALTER TABLE pets ADD CONSTRAINT `fk_pets_2_people` FOREIGN KEY (ownerId) references people(id) ON DELETE CASCADE;
le moteur peut essayer de supprimer les entrées des people
avant les pets
, provoquant ainsi l'erreur suivante:
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`))
La solution dans ce cas est de supprimer la ligne des people
et de s'appuyer sur les capacités ON DELETE
InnoDB
pour propager la suppression:
DELETE FROM people
WHERE name = 'Paul';
2 lignes supprimées
Paul est supprimé de People
Spot est supprimé en cascade de Pets
Une autre solution consiste à désactiver temporairement le contrôle sur les clés étrangères:
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;
Suppression de base
DELETE FROM `myTable` WHERE `someColumn` = 'something'
La clause WHERE
est facultative mais sans elle, toutes les lignes sont supprimées.
SUPPRIMER vs TRUNCATE
TRUNCATE tableName;
Cela supprimera toutes les données et réinitialisera l'index AUTO_INCREMENT
. C'est beaucoup plus rapide que DELETE FROM tableName
sur un énorme ensemble de données. Cela peut être très utile lors du développement / test.
Lorsque vous tronquez une table, le serveur SQL ne supprime pas les données, il supprime la table et la recrée, libérant ainsi les pages, ce qui permet de récupérer les données tronquées avant les pages écrasées. (L'espace ne peut pas être immédiatement récupéré pour innodb_file_per_table=OFF
.)
Multi-table DELETE
MySQL permet de spécifier à partir de quelle table les lignes correspondantes doivent être supprimées
-- 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'