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'


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow