6. La mise à jour de données

UPDATE et DELETE

Deux types de mises à jour sont possibles :

  1. modifier un enregistrement existant;
  2. effacer un enregistrement.

Update

Pour modifier un enregistrement, la commande est UPDATE

La syntaxe complète : http://www.sqlite.org/lang_update.html

Exemples

Téléchargez la BD du cours #6 sur LEA - EtudiantProgramme.sqlite.

Commençons par mettre la validation des foreign keys à ON

        
Copié
PRAGMA FOREIGN_KEYS = ON;

Nous sommes maintenant prêts à changer les données :

        
Copié
UPDATE EtudiantsSET Nom='Benoit Allard'WHERE DA = 'ALLM111111';

Si la clause WHERE ne retourne pas d'enregistrements, rien ne sera fait.

        
Copié
UPDATE EtudiantsSET Nom='Mauvais Where'WHERE DA = '12345';

Pour changer plusieurs enregistrements en une seule commande :

        
Copié
UPDATE EtudiantsSET ProgrammesId=410WHERE ProgrammesId = 420;

Notez que ce n'est pas la clé. Le where n'a pas besoin d'utiliser les clés.

Pour changer une valeur à partir de sa valeur existante.

        
Copié
UPDATE EtudiantsSET Nom= Nom || ' Junior'WHERE DA = 'ALLM111111';

Pour changer plusieurs colonnes.

        
Copié
UPDATE EtudiantsSET Nom='Michel Allard', ProgrammesId=420WHERE DA = 'ALLM111111';

Bien entendu, les règles de FK doivent être respectées.

        
Copié
UPDATE EtudiantsSET ProgrammesId=666WHERE ProgrammesId = 412;

Update From

Depuis la version 3.33.0, il est possible d'ajouter un FROM avec la mise à jour pour modifier une table à partir d'une autre table.

Référence

En gros le FROM génère une liste de données que l'on peut utiliser dans le WHERE pour comparer et le SET pour mettre à jour des données.

Exemple, si l'on veut modifier tous les noms d'étudiants du programme d,informatique pour ajouter après leur nom le nom de leur programme :

        
Copié
UPDATE EtudiantsSET Nom = Etudiants.Nom || ' ' || prog.NomFROM (SELECT Id, Nom FROM Programmes WHERE Nom = 'Informatique') AS progWHERE Etudiants.ProgrammesId = prog.Id;

Le FROM permet de générer la liste des programmes que l'on recherche (On en veut juste un, donc un ajoute un WHERE). C'est important de nommer un alias pour le FROM. Pour ce cas, l'alias est prog.

Après cela, l'objectif est de mettre à jour les étudiants seulement du programme d'informatique, alors on peut s'assurer que le programme de l'étudiant corresponde à notre FROM -> Etudiants.ProgrammesId = prog.Id.

Il est possible d'accéder aux données du FROM dans le SET. C'est ce que l'on fait dans ce cas, pour concaténer le nom du programme après le nom de l'étudiant -> SET Nom = Etudiants.Nom || ' ' || prog.Nom.

Important de mettre le nom de la table en cas de conflit. C'est le cas pour la colonne Nom qui est présente dans les deux tables.

Au final, la requête UPDATE FROM est utile pour mettre à jour des informations à partir d'une autre table et/ou de filtrer des données de la table selon une requête sur une table parent (via une clé étrangère).

Delete

Pour effacer un enregistrement, la commande est DELETE

La syntaxe complète : http://www.sqlite.org/lang_delete.html

Exemples

        
Copié
DELETEFROM CoursWHERE Id = '420PRA';

Ici aussi, les FK avec d'autres tables doivent être respectées

        
Copié
DELETEFROM CoursWHERE Id = '420BD1';

Exercice

Nous allons utiliser la BD du cours #6 sur LEA - EtudiantProgramme.sqlite - pour l'exercice.

Commencez par faire une requête pour comparer le résultat.

  1. Listez tous les étudiants avec leur note par cours. Vous devez afficher le nom du cours, le nom de l'étudiant et la note pour le cours. Ordonnancez par nom d'étudiants.
  2. Ouvrez un nouveau script avec Alt+e pour garder le résultat de la requête #1 accessible.
  3. Dans ce nouveau script, créez une requête pour mettre à jour toutes les notes de Gino Chouinard à 0, car il a triché! Utilisez son DA directement.
  4. Réexécutez la requête #1, vous devriez voir les deux notes de Gino Chouinard à 0.
  5. Refaite la même requête qu'en #3, mais on recherchant Gino Chouinard par son prénom et nom au lieu de son DA. Cette fois-ci donnez lui la note de 1 au lieu de 0.
  6. Le Cégep a décidé de bannir Gino Chouinard. Supprimez-le de la base de données avec ces notes aussi. Ne pas oubliez de respecter l'ordre de suppression.
  7. Réexécutez la requête #1, Gino Chouinard ne devrait plus être présent.

Import/Export

Jusqu'à maintenant, nous avons fait les ajouts et mise-à-jour manuellement. Mais si je veux passer de l'information d'une bd à une autre, est-ce que je dois retaper toutes les commandes de création ?

La réponse : non. Il est possible d'extraire les commandes ayant permis la création de la BD dans un fichier texte et de rejouer ces commandes.

Dans sqlite3

La commande est : .dump

Mais cette commande affiche le résultat à l'écran. Il faut donc indiquer que l'on veut envoyer le résultat dans un fichier : .output nomdufichier

Et une fois terminer, remettre l'output à l'écran : .output stdout

Le fichier contient les commandes de création de tables, ainsi que les inserts. À noter la commande PRAGMA foreign_keys=OFF; insérée au début du fichier.

Pour relire l'information, il suffit d'ouvrir une nouvelle bd et de faire un .read nomdufichier

Dans SqliteStudio

Dans le menu Databases, vous trouverez Export database

Il est possible d'exporter uniquement la structure sans les données.

Et il est possible d'exporter dans d'autres formats, tels que SQL, HTML, XML.

De plus, il est possible d'exporter les données d'une table dans le menu Tables/Export Table

Avec cette option d'export, il est possible d'exporter dans d'autres formats tels que CSV, JSON, XLS...

CSV est un format intéressant afin d'analyser les données avec Excel. En effet, un fichier CSV peut être lu directement par Excel (et par d'autres outils)


Version originale par Pierre-Luc Boulanger