UPDATE et DELETE
Deux types de mises à jour sont possibles :
- modifier un enregistrement existant;
- 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
PRAGMA FOREIGN_KEYS = ON;
Nous sommes maintenant prêts à changer les données :
UPDATE EtudiantsSET Nom='Benoit Allard'WHERE DA = 'ALLM111111';
Si la clause WHERE ne retourne pas d'enregistrements, rien ne sera fait.
UPDATE EtudiantsSET Nom='Mauvais Where'WHERE DA = '12345';
Pour changer plusieurs enregistrements en une seule commande :
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.
UPDATE EtudiantsSET Nom= Nom || ' Junior'WHERE DA = 'ALLM111111';
Pour changer plusieurs colonnes.
UPDATE EtudiantsSET Nom='Michel Allard', ProgrammesId=420WHERE DA = 'ALLM111111';
Bien entendu, les règles de FK doivent être respectées.
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.
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 :
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
DELETEFROM CoursWHERE Id = '420PRA';
Ici aussi, les FK avec d'autres tables doivent être respectées
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.
- 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.
- Ouvrez un nouveau script avec
Alt+epour garder le résultat de la requête #1 accessible. - 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.
- Réexécutez la requête #1, vous devriez voir les deux notes de Gino Chouinard à 0.
- 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.
- 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.
- 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