Cet article contient du SQL de base DELETE
instructions que les débutants peuvent utiliser pour supprimer des données de leurs tables de base de données.
Supprimer une seule ligne
Voici un exemple de base du SQL DELETE
déclaration.
DELETE FROM Owners
WHERE OwnerId = 5;
Dans ce cas, nous supprimons la ligne où le OwnerId
la colonne a une valeur de 4
.
Le DELETE
l'instruction commence par DELETE FROM
, suivi du nom de la table (c'est-à-dire la table qui contient les données que vous souhaitez supprimer).
Dans certains systèmes de gestion de bases de données (SGBD), le FROM
mot clé est facultatif, mais c'est une bonne idée de l'inclure pour une meilleure portabilité (au cas où vous auriez besoin d'exécuter le même code sur un SGBD différent).
Vous devez toujours inclure un WHERE
clause, sauf si vous souhaitez supprimer toutes les lignes de la table.
Oui, tu l'as bien lu. Omettre le WHERE
la clause supprimera toutes les lignes de la table.
La plupart des SGBD ont diverses autres options que vous pouvez utiliser avec le DELETE
déclaration, mais celles répertoriées ici sont les plus couramment utilisées.
Notez que le DELETE
l'instruction supprime toute la ligne. Vous ne pouvez pas supprimer la valeur d'une colonne individuelle dans une ligne. Pour cela, utilisez le SQL UPDATE
déclaration.
Exemple
Dans cet exemple, nous supprimons les données d'une table.
Tout d'abord, voyons ce qu'il y a dans le tableau.
SELECT * FROM Owners;
Résultat :
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Stallone | (489) 591-0408 | NULL | | 4 | Boris | Biden | (349) 611-8908 | [email protected] | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
OK supprimons le propriétaire numéro 5, puis sélectionnons à nouveau la table.
DELETE FROM Owners
WHERE OwnerId = 5;
SELECT * FROM Owners;
Résultat :
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Stallone | (489) 591-0408 | NULL | | 4 | Boris | Biden | (349) 611-8908 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
Nous pouvons voir que la dernière ligne a été supprimée comme spécifié.
Clés étrangères
Vous pouvez obtenir une erreur si vous essayez de supprimer des données référencées par une clé étrangère dans une autre table. En effet, la table dont vous essayez de supprimer les données est la table parent d'une relation. La table avec la clé étrangère (la table enfant) s'appuie sur les données de la table parent (c'est-à-dire les données que vous essayez de supprimer).
Que vous obteniez ou non une erreur dépendra de la configuration de la clé étrangère. La plupart des SGBD prennent en charge diverses options pour faire face à cette situation. Ces options peuvent inclure, déclencher une erreur, cascader la suppression dans la table de clé étrangère (c'est-à-dire supprimer la ligne de la table enfant), définir la clé étrangère sur NULL
, ou en le réglant sur sa valeur par défaut.
Voici un exemple de tentative de suppression d'une ligne référencée par une clé étrangère.
DELETE FROM Owners
WHERE OwnerId = 3;
Résultat :
Msg 547, Level 16, State 0, Line 1 The DELETE statement conflicted with the REFERENCE constraint "FK_Pets_Owners". The conflict occurred in database "PetHotel", table "dbo.Pets", column 'OwnerId'. The statement has been terminated.
Dans ce cas, une erreur a été générée et la ligne n'a pas été supprimée.
Dans cet exemple, le Owners.OwnerId
colonne est la clé primaire de cette table. Une autre table appelée Pets
a un OwnerId
colonne qui fait référence à cette colonne de clé primaire, et dans ce cas, il y a au moins une ligne qui fait référence au propriétaire numéro 3.
Si je voulais vraiment supprimer cette ligne, je devrais mettre à jour les données dans la table enfant afin qu'aucune ligne ne pointe vers ce propriétaire. Soit cela, soit modifiez la clé étrangère afin qu'elle utilise une option différente lorsque des opérations de suppression se produisent sur la clé primaire. La modification d'une clé étrangère peut être une option indésirable, selon ce que vous devez faire. Selon votre SGBD, il peut également être nécessaire de supprimer la clé existante et de la recréer.
Dans tous les cas, cette erreur est une bonne chose, car elle nous alerte sur un problème que nous aurons si nous supprimons cette ligne. Cela aide à renforcer l'intégrité référentielle.
Attention ! Oublier le WHERE
Article
Le DELETE
déclaration peut être une déclaration très dangereuse. Si vous omettez le WHERE
clause, vous supprimerez tous lignes du tableau.
Heureusement, vous pouvez être sauvé par des contraintes de clé étrangère si vous essayez de supprimer des données de la table parent d'une relation.
Mais que faire si ce n'est pas le cas. Que se passe-t-il si aucune erreur n'est générée par vos instructions de suppression ?
Découvrons-le!
Exécutons un autre DELETE
déclaration, mais cette fois nous oublierons d'inclure le WHERE
clause. De plus, cette fois, nous allons l'exécuter sur une table qui n'est pas un parent dans une relation.
Voyons d'abord ce qu'il y a dans le tableau.
SELECT * FROM Pets;
Résultat :
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
OK, nous avons donc huit animaux de compagnie. Nous pouvons en fait voir que trois animaux appartiennent au propriétaire numéro 3 - le propriétaire que nous avons essayé de supprimer dans l'exemple précédent. C'est pourquoi nous avons eu l'erreur.
Quoi qu'il en soit, allons-y et exécutons notre DELETE
déclaration sans le WHERE
clause, puis vérifiez à nouveau la table
DELETE FROM Pets;
SELECT * FROM Pets;
Résultat :
(8 rows affected) (0 rows affected)
Le (8 rows affected)
partie signifie que huit lignes ont été supprimées.
Le (0 rows affected)
partie signifie qu'aucune ligne n'a été sélectionnée (parce qu'il n'y a pas de lignes dans le tableau.
Oups !
Il peut arriver que vous deviez en fait supprimer toutes les lignes du tableau. Selon la taille du tableau, cette déclaration sera tout ce dont vous avez besoin.
Si vous avez besoin de supprimer une table plus grande, il y a aussi TRUNCATE TABLE
, qui supprime toutes les lignes d'une table ou des partitions spécifiées d'une table, sans enregistrer les suppressions de lignes individuelles (le DELETE
déclaration enregistre ces suppressions).
Par conséquent, TRUNCATE TABLE
est plus rapide et utilise moins de ressources système et de journaux de transactions.
Exemple d'utilisation de TRUNCATE TABLE
:
TRUNCATE TABLE Owners;
Notez que cela peut ne pas fonctionner si la table est référencée par une contrainte de clé étrangère, même s'il n'y a pas de lignes enfants. Dans ce cas, DELETE
peut fonctionner à la place.