INSERT
permet d’insérer des données dans une table d’une base de données (comme une base MySQL ou PostgreSQL par exemple).
L’insertion de données en base avec SQL INSERT… INTO
est l’une des opérations de base et des plus courantes qu’on va effectuer lors de la manipulation des données des bases de données au même titre que la sélection avec la commande SQL SELECT
ou la mise à jour de données avec SQL UPDATE
.
SQL INSERT
va nous permettre d’ajouter une ou plusieurs entrées d’un coup dans une base de données.
Syntaxe de la commande SQL INSERT
La commande SQL INSERT
va nous permettre d’insérer de nouvelles données (entrées) dans une table. On va pouvoir ne préciser que les valeurs relatives à certaines colonnes ou les valeurs pour chaque colonne lors de l’insertion. Nous allons également pouvoir choisir d’insérer une ou plusieurs entrées d’un coup dans notre table SQL avec INSERT
.
Insérer une entrée en précisant des valeurs pour chaque colonne
Dans la majorité des cas, nous allons utiliser INSERT
pour insérer une nouvelle entrée dans une table d’une base de données en précisant des valeurs pour chaque colonne de la table.
Dans ce cas, nous allons pouvoir utiliser la syntaxe INSERT INTO nom_de_table VALUES 'valeur 1', 'valeur 2', …)
.
Cette commande signifie littéralement “insère dans la table “nom_de_table” les valeurs “valeur1”, “valeur2”, etc.
Lorsqu’on précise des valeurs pour chaque colonne de la table, il n’y a pas d’ambiguïté sur les valeurs et il n’est donc pas nécessaire de préciser les noms de colonnes avec chaque valeur. SQL va placer les valeurs dans les colonnes dans l’ordre de leur écriture (la première valeur ira dans la première colonne disponible en écriture, la deuxième valeur dans la deuxième colonne, etc.).
Notez que si votre table dispose d’une colonne de type id
avec un auto_increment
et une valeur not null
par défaut, alors on pourra se contenter de préciser 0 ou null en valeur de cette colonne et la valeur sera automatiquement incréments correctement.
Insérer une entrée en précisant des valeurs pour certaines colonnes uniquement
Nous allons également pouvoir utiliser INSERT
pour insérer de nouvelles entrées en ne précisant les valeurs à insérer que pour certaines colonnes et en laissant les autres vides.
Dans ce cas, il va bien entendu falloir que les colonnes laissées vides aient une valeur par défaut différente de none
et il va également falloir indiquer au SQL à quelle colonne correspond chaque valeur c’est-à-dire dans quelle colonne chaque valeur doit être stockée.
Nous allons donc ici devoir également préciser les noms des colonnes relatives à chaque donnée et allons pour cela utiliser la syntaxe suivante : INSERT INTO nom_de_table (nom_colonne1, nom_colonne2, …) VALUES ('valeur 1', 'valeur 2', …)
.
Vous pouvez noter ici qu’il n’est pas nécessaire d’entourer les noms des colonnes avec des apostrophes ou guillemets simples.
Notez également que si votre table dispose d’une colonne id
en clef primaire avec une option d’auto incrémentation, vous pouvez omettre la valeur qui sera remplie automatiquement par le SQL.
Insérer plusieurs entrées avec SQL INSERT
Finalement, nous allons également pouvoir utiliser la commande SQL SELECT
pour insérer plusieurs entrées à la fois. Pour cela, nous allons séparer les valeurs des différentes entrées avec une virgule.
Ici, nous allons une nouvelle fois pouvoir choisir de préciser les valeurs pour chaque colonne de la table ou ne préciser les valeurs que pour certaines colonnes. La seule règle à respecter est que chaque nouvelle entrée insérée doit être de la même forme que les autres, c’est-à-dire que les données précisées doivent correspondre aux mêmes colonnes que les précédentes.
Nous n’allons donc pas pouvoir insérer les données relatives aux trois premières colonnes de notre table pour une entrée, puis les données relatives aux colonnes 1, 4 et 5 pour une autre entrée d’un coup par exemple.
Pour insérer plusieurs entrées en précisant des valeurs pour chaque colonne, nous allons utiliser la syntaxe suivante : INSERT INTO nom_de_table VALUES ('valeur 1.1’, 'valeur 1.2’, …), ('valeur 2.1’, 'valeur 2.2’, …), ('valeur 3.1’, 'valeur 3.2’, …)
.
Si on ne souhaite préciser les valeurs que pour certaines colonnes, il faudra indiquer le nom des colonnes comme précédemment : INSERT INTO nom_de_table (nom_colonne1, nom_colonne2, …) VALUES ('valeur 1.1’, 'valeur 1.2’, …), ('valeur 2.1’, 'valeur 2.2’, …), ('valeur 3.1’, 'valeur 3.2’, …)
.
Exemples d’utilisation de SQL INSERT pour insérer des données dans une table MySQL
Pour tester la commande SQL INSERT
, nous allons avoir besoin d’une base de données avec une table au moins.
Il existe différentes méthodes créer une base de données et une table. Les deux plus courantes sont l’utilisation de phpMyAdmin ou d’un script PHP avec une extension mysql ou PDO.
Ici, nous allons créer une base MySQL cours
contenant une table users
. Je vous invite donc à démarrer vos serveurs (en utilisant MAMP, WAMP, etc.) et à aller dans votre phpMyAdmin (accessible depuis la page de démarrage de WAMP, MAMP…).
Créez ensuite la base cours
en allant dans l’onglet “base de données” puis dans le champ “créer un base”. Sélectionnez finalement la base en cliquant dessus puis allez dans l’onglet “import” pour importer la table users
que je vous ai préparée et que vous pouvez télécharger en cliquant ici.
Cette table users
contient 6 colonnes et huit champs comme sur l’image ci-dessous :
Insertion de données via phpMyAdmin
Essayons d’insérer de nouvelles entrées dans notre table en tapant nos commandes SQL directement dans l’onglet “SQL” de phpMyAdmin.
Nous allons déjà commencer par insérer une entrée unique en précisant les données pour chaque colonne de notre table. Comme notre première colonne est une colonne id
avec auto_increment
, nous pouvons préciser 0 ou null afin que MySQL définisse automatiquement une valeur incrémentée par rapport à la précédente.
Ici, j’utilise également la fonction CURRENT_TIMESTAMP
pour le champ date d’inscription afin que la date corresponde à la date exacte où l’entrée a été insérée.
Essayons maintenant d’insérer plusieurs entrée à la fois en ne précisant les valeurs que de certaines colonnes. Pour que notre requête fonctionne normalement, les colonnes omises devront avoir une valeur par défaut différentes de none
. Je vous invite donc à aller dans l’onglet “structure” de votre table et à modifier la valeur par défaut des colonnes “age” et “mail” en indiquant NULL
plutôt que none
.
Essayons ensuite d’insérer deux entrées en ne précisant que les valeurs des colonnes “prenom”, “nom” et “age” :
Comme vous pouvez le constater, les valeurs de la colonne “id” sont toujours automatiquement incréments tandis que les valeurs de la colonne “inscription_date” sont par défaut égales à CURRENT_TIMESTAMP
. Les valeurs de “mail” sont NULL
par défaut.
Insertion de données avec PHP et l’extension PDO
Nous voudrons souvent insérer des données en base de données de manière dynamique, par exemple lorsqu’un client nous fournit des informations d’inscription. Pour réaliser cela, nous n’allons pas pouvoir passer par phpMyAdmin mais devrons plutôt utiliser un langage de script serveur comme le PHP.
Pour communiquer avec les bases de données, nous allons pouvoir utiliser l’une des deux extensions PHP mysql ou PDO. Dans ce tutoriel, j’utiliserai PDO.
Commençons par créer un fichier insert.php
. Ce fichier va contenir le code PHP pour se connecter à la base de données cours
et pour insérer les données dans notre table users
.
Pour insérer les données, nous allons ici utiliser les requêtes préparées et donc les fonctions prepare()
et execute()
. Nous allons utiliser des marqueurs nommés et passer un tableau avec des valeurs prédéfinies à execute()
pour plus de simplicité.
<!DOCTYPE html> <html> <head> <title>Cours PHP / MySQL</title> <meta charset='utf-8'> </head> <body> <h1>Bases de données MySQL</h1> <?php $servname = "localhost"; $dbname = "cours"; $user = "root"; $pass = "root"; try{ $dbco = new PDO("mysql:host=$servname;dbname=$dbname", $user, $pass); $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $donnees = [ 'id' => 0, 'prenom' => 'Anna', 'nom' => 'Giraud', 'age' => 16, 'mail' => 'agird@gmail.com', //Retourne la date actuelle pour moi (GMT+2) 'date_ins' => date('Y-m-d G:i:s', time()+3600*2), ]; //On utilise les requêtes préparées et des marqueurs nommés $sth = $dbco->prepare( "INSERT INTO users VALUES (:id, :prenom, :nom, :age, :mail, :date_ins)" ); $sth->execute($donnees); echo 'Entrée ajoutée dans la table'; } catch(PDOException $e){ echo "Erreur : " . $e->getMessage(); } ?> </body> </html>
Ce script se connecte à la base de données cours
et ajoute une entrée dans la table users
avec les valeurs suivantes :
La principale difficulté pour moi ici est de fournir une valeur au bon format pour la colonne “date_inscription” de notre table. On fait cela en utilisant la fonction PHP date()
pour formater la date au bon format et en lui passant la date actuelle avec time()
à laquelle j’ajoute 2 heures pour que cela corresponde à la configuration de ma base de données.
Si on ne souhaite préciser les valeurs que pour certaines colonnes, il faudra à nouveau préciser le nom des colonnes dans notre requête SQL. Si on souhaite insérer plusieurs entrées d’un coup, on pourra utiliser une boucle PHP mais la façon la plus simple reste d’utiliser plusieurs requêtes d’insertion, chaque requête insérant une nouvelle entrée.
Insérer de nouvelles colonnes dans une table SQL avec ALTER TABLE
Enfin, notez que dans le cas où on souhaite ajouter de nouvelles colonnes à une table d’une base de données plutôt que de nouvelles entrées, il faudra utiliser la commande SQL ALTER TABLE
et non pas INSERT INTO
.