SQL INSERT INTO – Insertion de données en base de données

La commande SQL 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 :

Création d'une base SQL et d'une table

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.

Instruction SQL INSERT INTO pour insérer une entrée en base de données MySQL

Résultat de l'instruction SQL INSERT INTO pour insérer une entrée en base de données MySQL

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” :

Requête SQL INSERT INTO pour insérer plusieurs entrées en base de données MySQL

Résultat de la requête SQL INSERT INTO pour insérer plusieurs entrées en base de données MySQL

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 :

Création d'un requête SQL INSERT INTO avec PDO en PHP

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.

Laisser un commentaire