Insérer une ligne dans une table MySQL revient à exécuter la commande INSERT :
INSERT INTO nom_table (Champ1, Champ2, ....) VALUES (Valeur1, Valeur 2, ... )
La liste des colonnes fournies à la suite du nom de la table correspond aux différentes colonnes que l'on souhaite remplir pour la ligne, avec les valeurs (ordonnées) qui suivent le mot clef VALUE. Dans le cas où une colonne n'est pas citée, elle prendra soit la valeur par défaut indiquée lors de la création de la table, soit la valeur NULL si elle autorisée.
Exemple 3. Insertion d'une collection
mysql> INSERT INTO collection(COL_NOM, COL_EDITEUR)
-> VALUES ("Ailleurs et Demain", "Robert Laffont");
Query OK, 1 row affected (0.01 sec)
Dans cet exemple, on ne donne pas la valeur de l'identifiant, qui sera automatiquement incrémenté.
Dans le cas d'insertions multiples, il est possible de les concentrer sur la même instruction, en séparant les listes de valeurs par une virgule :
mysql> INSERT INTO collection(COL_NOM, COL_EDITEUR)
-> VALUES ("Ailleurs et Demain Classiques", "Robert Laffont"),
-> ("Antologie de la Science Fiction","J'ai Lu"),
-> ("Special Suspens","Robert Laffont");
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> insert into auteur (AUT_NOM, AUT_PRENOM, AUT_DATE_NAISSANCE)
-> VALUES ("Herbert", "Brian", "1944-12-10"),
-> ("Anderson", "Kevin", "1962-03-27"),
-> ("Herbert", "Frank", "1920-10-08");
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
L'insertion au moyen de la requête INSERT renvoie une erreur si la valeur de l'identifiant est déjà prise :
mysql> INSERT INTO collection(COL_NUM, COL_NOM, COL_EDITEUR)
-> VALUES (3, "Fleuve Noir", "Livre de Poche");
ERROR 1062 (23000): Duplicate entry '3' for key 1
mysql>
Dans ce cas il est possible d'utiliser la commande REPLACE qui écrasera la ligne :
mysql> REPLACE INTO collection(COL_NUM, COL_NOM, COL_EDITEUR)
-> VALUES (3, "Fleuve Noir", "Livre de Poche");
Query OK, 2 rows affected (0.01 s)
Pour visualiser le contenu la table après ces insertions, il nous faut utiliser la commande SELECT (nous la verrons en détail dans le chapitre suivant) :
mysql> select * from collection; +---------+---------------------------------+----------------+ | COL_NUM | COL_NOM | COL_EDITEUR | +---------+---------------------------------+----------------+ | 2 | Ailleurs et Demain | Robert Laffont | | 3 | Fleuve Noir | Livre de Poche | | 4 | Ailleurs et Demain Classiques | Robert Laffont | | 5 | Antologie de la Science Fiction | J'ai Lu | | 6 | Special Suspens | Robert Laffont | +---------+---------------------------------+----------------+ 5 rows in set (0.00 sec)
Mettre des données à jour en SQL se fait généralement via les instructions UPDATE. Cette instruction permet la mise à jour des lignes correspondant à une (des) conditions(s). C'est pourquoi elle est généralement couplée à la clause WHERE :
UPDATE relation SET attribut=valeur, ... [ WHERE condition ]
Dans le cas où la clause WHERE est absente, la mise-à-jour s'appliquera sur toutes les lignes de la table.
La clause WHERE, que nous verrons en détail dans le chapitre suivant, contient des expressions logiques que doivent vérifier les lignes sur lesquelles portent les modifications :
mysql> UPDATE collection
-> SET COL_EDITEUR = "Le Livre de Poche"
-> WHERE COL_NOM LIKE "Antologie de la Science Fiction";
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> UPDATE auteur set AUT_DATE_NAISSANCE = "1944-10-12"
-> WHERE AUT_NOM="Herbert"
-> AND AUT_PRENOM ="Brian";
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
Il est également possible d'utiliser la valeur de la première de la colonne dans le calcul de la nouvelle valeur :
mysql> UPDATE auteur SET AUT_NOM = UPPER(AUT_NOM); Query OK, 3 rows affected (0.01 sec) Rows matched: 3 Changed: 3 Warnings: 0
Dans cet exemple, la mise à jour va s'appliquer à toute les lignes de la table (pas de clause WHERE). La fonction UPPER permet de passer une chaîne de caractère en majuscule.
mysql> SELECT * FROM auteur; +---------+----------+------------+--------------------+ | AUT_NUM | AUT_NOM | AUT_PRENOM | AUT_DATE_NAISSANCE | +---------+----------+------------+--------------------+ | 1 | HERBERT | Brian | 1944-10-12 | | 2 | ANDERSON | Kevin | 1962-03-27 | | 3 | HERBERT | Frank | 1920-10-08 | +---------+----------+------------+--------------------+ 3 rows in set (0.00 sec)
La suppression d'un ou plusieurs enregistrement est définitive. La requête DELETE permet de réaliser cette tâche :
DELETE [ LOW_PRIORITY ] FROM relation [ WHERE condition ];
Comme pour l'instruction UPDATE, si la clause WHERE est omise, la table entière est détruite, et une table vide recréée. Si la clause WHERE est précisée, seules les lignes satisfaisant à la (aux) condition(s) sont supprimées. La clause LOW_PRIORITY permet de spécifier à MySQL d'attendre que les éventuels accès en lecture soient terminés pour procéder à l'effacement.
mysql> DELETE FROM collection
-> WHERE COL_NOM = "Fleuve Noir";
Query OK, 1 row affected (0.01 sec)Si la ligne est impliqué dans une intégrité référentielle de type clef étrangère, la requête peut échouer :
mysql> DELETE FROM collection
-> WHERE COL_NOM = "Ailleurs et Demain"
-> ;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails
(`bibliotheque/livre`, CONSTRAINT `livre_ibfk_1` FOREIGN KEY (`COL_NUM`) REFERENCES `collection` (`COL_NUM`) ON UPDATE CASCADE)
Afin de pouvoir réaliser les exercices d'applications et les différents exemples du cours, vous pouvez télécharger les scripts de création de base et d'insertion des enregistrements :
Base de données "Hotel" : création de la base et insertion des données
Base de données "vidéothèque" :création de la base et insertion des données
Base de données "bibliothèque" : création de la base et insertion des données
Vous serez, selon la configuartion des systèmes, peut-être amené à modifier l'encodage des caractères.