Database
 sql >> Base de données >  >> RDS >> Database

SQL DELETE pour les débutants

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.