1

Chapitre 4 :
Créer une base de données

Supprimer des données : Support de cours

Support de cours : Supprimer des données

Dans ce tuto, nous allons voir qu'il est possible de supprimer des données, c'est à dire des lignes de la base de données, soit à l'aide de requêtes SQL soit avec phpMyAdmin. Nous verrons que quelle que soit la solution retenue les contraintes de clés étrangères peuvent bloquer la suppression des données.

Les requêtes SQL

Il existe deux instructions qui suppriment des lignes DELETE et TRUNCATE TABLE

La requête DELETE

L'instruction DELETE supprime toutes les lignes d'une table sauf si elle est accompagnée de l'instruction WHERE qui permet de faire des restrictions.

Supprimer toutes les données d'une table.

L'instruction suivante supprime toutes les données d'une table :

DELETE FROM `Table`;

Imaginons une table Mangas :

Table Mangas
 id nom auteur
1 Naruto Masashi Kishimoto
2 Fairy Tail Hiro Mashima
3 Seven Deadly Sins Nakaba Suzuki
4 Rave Hiro Mashima

La requête DELETE FROM `Manga`; permet de supprimer toutes les lignes de la table "Mangas" et d'obtenir la résultat suivant :

Table Mangas
 id nom auteur

Comme vous pouvez le voir, c'est assez radical. Il est possible de ne supprimer que certaines lignes.

Supprimer une ou plusieurs lignes d'une table

Pour sélectionner les lignes à supprimer, il faut faire une restriction à l'aide de l'instruction WHERE

DELETE FROM `table`

WHERE conditions;

Si on reprend la table Mangas :

Table Mangas
 id nom auteur
1 Naruto Masashi Kishimoto
2 Fairy Tail Hiro Mashima
3 Seven Deadly Sins Nakaba Suzuki
4 Rave Hiro Mashima

Il est possible de ne supprimer qu'une seule ligne. Par exemple si vous voulez supprimer le manga n°3

DELETE FROM `Mangas`
WHERE id=3;

 La table contiendra ces données :

Table Mangas
 id nom auteur
1 Naruto Masashi Kishimoto
2 Fairy Tail Hiro Mashima
4 Rave Hiro Mashima

Mais il est aussi possible de supprimer plusieurs lignes si la restriction correspond à plusieurs lignes. Par exemple, si vous voulez supprimer les deux mangas écrits par Hiro Mashima

DELETE FROM Mangas
WHERE Auteur="Hiro Mashima";

Cette requête appliquée à la table Mangas d'origine (qui contient les 4 mangas) laissera les données suivantes

Table Mangas
 id nom auteur
1 Naruto Masashi Kishimoto
3 Seven Deadly Sins Nakaba Suzuki

Vous pouvez étudier l'instruction WHERE dans le cours Notions de bases en SQL 

La requête TRUNCATE TABLE

L'instruction TRUNCATE TABLE supprime toutes les lignes d'une table comme l'instruction DELETE. Mais en plus, elle réinitialise l'auto increment. 

Si on part de la table Manga

Table Mangas
 id nom auteur
1 Naruto Masashi Kishimoto
2 Fairy Tail Hiro Mashima
3 Seven Deadly Sins Nakaba Suzuki
4 Rave Hiro Mashima

L'instruction suivante vide la table et réinitialise l'autoincrément

TRUNCATE TABLE Mangas;

Il ne reste donc plus que :

Table Mangas
 id nom auteur

Si ensuite on rajoute une ligne sans préciser de valeur pour la colonne id :

INSERT INTO Mangas ('nom', 'auteur') VALUES ('Death Note', 'Tsugumi Õba');
INSERT INTO Mangas(nom, auteur)
VALUES ('Death Note', 'Tsugumi Ōba');

L'identifiant du nouveau manga est 1 car l' autoincrement a été réinitialisé : 

Table Mangas
 id nom auteur
1 Death Note Tsugumi Ōba

A l'inverse si pour vider la table on utilise DELETE FROM

DELETE FROM Mangas;

On obtient bien la table vide :

Table Mangas
 id nom auteur

Si ensuite on rajoute une ligne sans préciser de valeur pour la colonne id :

INSERT INTO Mangas(nom, auteur)
VALUES ('Death Note', 'Tsugumi Ōba');

L'identifiant du nouveau manga est 5 car l' autoincrement n'a pas été modifié et le dernier identifiant utilisé avant la suppression des données était le 4 : 

Table Mangas
 id nom auteur
5 Death Note Tsugumi Ōba

La suppression de données dans phpMyAdmin

Effacer une ou plusieurs lignes (équivalent DELETE)

Pour effacer une ligne suivez la procédure suivante :

  1. afficher le contenu de la table en cliquant sur le nom de la table dans l'arborescence située à gauche
  2. cliquer sur le lien "Supprimer" de la ligne à supprimer
  3. Dans la modale qui s'affiche, cliquer sur Ok pour valider la suppression

Tuto delete une seule ligne

Pour effacer plusieurs lignes d'un coup :

  1. afficher le contenu de la table en cliquant sur le nom de la table dans l'arborescence située à gauche
  2. cocher les lignes à supprimer ou utiliser le bouton "Tout cocher"
  3. cliquer sur le lien "Supprimer" situé sous le tableau qui contient les données
  4. Dans la modale qui s'affiche, cliquer sur Ok pour valider la suppression

tuto delete plusieurs lignes

Vider une table (équivalent TRUNCATE)

Pour vider une table et réinitialiser son auto increment :

  1. afficher toutes tables de la base de données en cliquant sur le nom de la base dans l'arborescence située à gauche
  2. cliquer sur le lien "vider" de la table à vider

Tuto truncate table

Les contraintes de clés éttrangères bloquent la suppression des données

Lorsque vous essayez de supprimer des données, il est possible que Mysql retourne l'erreur "1451 -Cannot update or delete a parent row: a foreign key constraint fails..."

Cette erreur signifie 3 choses :

  1. la valeur de la clé primaire d'une des lignes que vous essayez de supprimer est utilisée comme valeur d'une clé étrangère dans une autre table.
  2. une contrainte de clé étrangère existe entre la clé primaire et la clé étrangère
  3. cette contrainte a été configuré sur ON DELETE RESTRICT (la valeur par défaut)

Par exemple imaginons que vous ayez une base de données qui corresponde à ce schéma :

Mangas (id, nom, auteur)
Clé primaire id

Episodes(id_episode, titre, ordre, id_manga)
Clé primaire : id_episode
Clé étrangère : id_manga en référence à id de la table manga

Les tables seraient : 

Table Mangas
 id nom auteur
1 Naruto Masashi Kishimoto
2 Fairy Tail Hiro Mashima
3 Seven Deadly Sins Nakaba Suzuki
4 Rave Hiro Mashima

 

Table Episodes
 id_episode titre ordre id_manga
1 Et voici Naruto Uzumaki 1 1
2 Je m'appelle Konohamaru 2 1
3 Sasuke et Sakura : amis ou ennemis ? 3 1
... ... ... ...

Lors de la suppression du manga n°1 avec

DELETE FROM Mangas WHERE id=1;

Si vous obtenez le message suivant : 

#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`mangas`.`episodes`, CONSTRAINT `fk_mangas_episode` FOREIGN KEY (`id_manga`) REFERENCES `mangas` (`id`))

Cela signifie qu'une contrainte de clé étrangère vous empêche de supprimer le manga n°1 car il existe des épisodes dont l'id_manga est égale à 1. Or, en lisant le message on peut voir que la contrainte "fk_mangas_episodes" défini la clé étrangère "id_manga" qui fait référence au champ "id" de la table "Mangas".

Pour contourner le problème de la clé étrangère il y a deux solutions :

La première consiste à commencer par supprimer dans la table qui contient la clé étrangère, toutes les lignes dont la valeur de la clé étrangère est égale à la valeur de la clé primaire que vous voulez supprimer. Dans notre exemple si l'on veut supprimer le manga n°1, on commence par supprimer tous les épisodes qui ont id_manga égale à 1. Cela donnerait :

DELETE FROM Episodes WHERE id_manga=1;
DELETE FROM Mangas WHERE id=1;

 Cette solution est à privilégier, car elle vous assure de garder des données cohérentes.

La seconde solution consiste à désactiver la clé étrangère avec l'instruction :

SET FOREIGN_KEY_CHECKS=0;

Attention, l'objectif de la clé étrangère est de garder des données cohérentes. Dans notre exemple le but de la clé étrangère est de s'assurer que tous épisodes font référence à des mangas qui existent. Désactiver les clés étrangères est donc une solution dangereuse ! Il est aussi primordiale de réactiver les clés étrangères en redonnant la valeur 1 à FOREIGN_KEY_CHECKS.

Pour supprimer le manga n°1 :

SET FOREIGN_KEY_CHECKS=0;
DELETE FROM Mangas WHERE id=1;
SET FOREIGN_KEY_CHECKS=1;


Cours validé
1 / 1
Supprimer des données