Découverte de la commande SQL : INSERT INTO

 

En SQL l'insertion de données s'effectue grâce à la commande INSERT INTO. En effet, cette commande permet d'ajouter un nouvel enregistrement dans la table de notre base de données (que le moteur de utilisé soit MariaDB,Mysql,PostGreSQL,Transact-SQL, Oracle ou toute autre SGBD).

En SQL, INSERT INTO est la commande la plus couramment utilisée en SQL pour manipuler nos données de même que les trois autres commandes fondamentales en SQL, à savoir SELECT,UPDATE et DELETE.

INSERT INTO va donc nous servir à créer une ou plusieurs nouvelles entrées. Nous aborderons également la méthode BULK INSERT et la commande LOAD DATA INFILE, qui permet l'ajout massif de données depuis un fichier CSV ou TXT simplement et rapidement. 

 

Syntaxe primaire de la commande SQL : INSERT INTO

 

Pour créer un nouvel enregistrement en base la commande INSERT INTO s'utilise de la manière suivante :

 

INSERT INTO ma_table (colonne_1, colonne_2, colonne_3) VALUES ('première', 'seconde ', 'troisième')

On précise le nom de chacune des colonnes (à noter que seules les valeurs sont encapsulées par des guillemets ou des apostrophes), puis on désigne chaque valeur qui lui sera assignée. Cette syntaxe à l'avantage de ne pas nous obliger à remplir chacune des colonnes. En effet nous pouvons parfaitement effectuer la commande SQL INSERT suivante :

 

INSERT INTO ma_table (colonne_2, colonne_3) VALUES ('seconde', 'troisième')

En supposant que la colonne_1 soit une clé primaire auto incrémentale, cela nous évite d'écrire :

 

INSERT INTO ma_table (colonne_1,colonne_2, colonne_3) VALUES (NULL,'seconde', 'troisième')

La valeur de notre première colonne sera automatiquement assignée par la base de données.

 

Il est également possible d'effectuer un INSERT sans préciser les colonnes, que nous désirons utiliser dans ce cas, le moteur de SGBD interprétera implicitement l'ordre des colonnes de la table. Nous pouvons également inclure des fonctions natives au moteur SQL directement dans notre requête. Ici nous utiliserons la fonction NOW() qui retourne la date et l'heure lors de l'éxécution de la requête.

 

Pour une table appelée users avec trois colonnes :

user log comment

 

 

la requête INSERT propre à ce format sera :

 

INSERT INTO users VALUES ('john', NOW(),'mysql c'est super !')

Ce qui reviendrait à la requête SQL INSERT INTO :

 

INSERT INTO users (user,log,comment) VALUES ('john', NOW(),'mon super commentaire')

Syntaxe avancée avec SELECT de la commande SQL : INSERT INTO

 

Le SQL nous permet d'effectuer un INSERT directement depuis une requête SELECT.

Bien que ce genre de commande soit décriée pour une question de performance, elles peuvent s'avérer utiles dans certains cas. La syntaxe de ces requêtes répondra à ce modèle :

 

INSERT INTO ma_table_1 (colonne_1,colonne_2, colonne_3) VALUES ((SELECT colonne_1 FROM ma_table_2 LIMIT 1),'seconde valeur', 'troisième valeur')

À noter qu'il est impératif que la sous requête :

 

(SELECT colonne_1 FROM ma_table_2 LIMIT 1)

Ne retourne qu'un seul et unique résultat d'une seule colonne. Sans quoi le moteur SQL retournera une erreur et l'enregistrement ne sera pas inclus dans la table lors de la commande INSERT INTO.

 

Syntaxe avancée SQL avec multiples entrées :

 

Il est possible de créer de multiples insertions d'entrées dans notre base de données, en n'écrivant qu'une fois l'entête de la commande INSERT INTO et en lui adjoignant plusieurs lots de VALUES toutes séparées par une simple virgule. En supposant à nouveau notre table users à trois colonnes, la syntaxe de notre requête SQL avancée devient donc :

 

INSERT INTO users (user,log) VALUES ('john',NOW()),('pierre',NOW()),('paul',NOW()),('doe',NOW()) ;

Cette requête INSERT produira quatre enregistrements dans notre table users. Sachez qu'il est tout à fait possible de profiter de l'ordre implicite des colonnes de la table et donc de ne pas les préciser. Ceci nous obligera à assigner une valeur à chaque colonne, sans quoi la requête provoquera une erreur du SGBD.

 

De même, nous pouvons également appliquer ce que nous avons vu avec les insertions via sous-requête (bien que cela reste toujours discutable sur le plan de la performance).

 

Syntaxe avancée SQL avec la commande BULK INSERT EN T-SQL :

 

Pour charger des lots d'enregistrements issus de fichiers volumineux en csv ou en txt de la façon la plus optimisée possible. Certains moteurs de gestion de base de données SQL (dont le Transact-SQL, ORACLE,SQL), on ajoute à la liste de leur commande, BULK.

 

Une requête BULK vise à charger des ensembles de lignes directement depuis un jeu de données (aussi appelée dataset) sans avoir besoin de créer chaque requête manuellement.

 

La syntaxe d'une requête BULK est rapide et simple :

 

BULK INSERT ma_table FROM 'c:\monfichier.csv' ;

Syntaxe avancée SQL avec la commande LOAD DATA INFILE :

 

D'autre langage comme le MySQL et le MariaDB on répondu en ajoutant la commande LOAD DATA INFILE elle se comporte de la même façon que la requête BULK vue plus haut.

 

LOAD DATA INFILE '/monfichier.csv/' INTO TABLE ma_table ;

De nombreux paramètres existent, mais les deux plus importants sont FIELDS TERMINATED BY qui permet de définir que chaque champ est séparé par un point virgule.

 

LOAD DATA INFILE '/monfichier.csv/' INTO TABLE ma_table FIELDS TERMINATED BY ' ;' ;

Et le paramètre IGNORE X LINES qui sert à déclaré que le fichier CSV dispose d'un en tête et que celui-ci doit être ignoré par la commande lors du traitement du lot des données.

 

LOAD DATA INFILE '/monfichier.csv/' INTO TABLE ma_table FIELDS TERMINATED BY ' ;' IGNORE 1 LINES ;

INSERT MYSQL avec l'objet PDO en PHP :

Pour nous connecter à une base de données MySQL en PHP nous utiliserons l'objet PDO.

L'objet PDO est une classe PHP qui permet de créer une interface avec la base de données, ici MySQL. Cet objet simplifie les accès à la base de données et ajoute une couche de sécurité supplémentaire lors de la manipulation des données.

 

Dans l'exemple suivant nous allons effectuer une requête INSERT INTO dans notre table user (qui contient toujours ses trois colonnes user,log,comment). Le tout en utilisant l'objet PDO et les requêtes préparées pour se protéger contre d'éventuelles injections SQL. Nous assignons au champ user la valeur "john" et au champ comment la valeur "Commentaire sur l'utilisation", le champ log sera quant à lui rempli automatiquement par la valeur qui sera retournée par la fonction NOW() cette fonction retournant la date et l'heure du moment ou la requête est exécutée.

 

Pour ce faire nous utilisons les marqueurs nommés :user ainsi que le marqueur nommé :comment dans notre requête SQL. Lors de la préparation de la requête via la méthode prepare(), ceux-ci serons remplacer par les valeurs echappés et sécurisés.

 

$dba = new PDO("mysql:host=127.0.0.1;dbname=DataBase","user","password",array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION )); 

try{
    $dic = array("user" => "john","comment"=>"Commentaire sur l'utilisation");
	$query = "INSERT INTO user VALUES(:user,NOW(),:comment)";

	$request= $dba->prepare($query);
	$request->execute($dic);
}
catch(PDOException $pdo_e){
  //En cas d'erreur MYSQL
}
catch(Exception $e){
  //Autres erreurs
}
finally{
	$dba = null;
}

Si vous souhaitez davantage d'informations sur les bonnes pratiques lors de l'utilisation de l'objet PDO nous vous invitons à lire là publication : objet PDO PHP MYSQL - protection contre les injections SQL. 

INSERT en MYSQL grâce au Csharp :

 

Pour effectuer une requête INSERT INTO MYSQL en Csharp, il faut dans un premier temps récupérer la DLL (MySql.Data) et l'ajouter en référence à notre projet. Une fois que c'est fait, il faudra ouvrir la connexion à notre base de données, réaliser notre commande cela se fait en quelques lignes de codes :

 

using MySql.Data.MySqlClient;

namespace Test{

	class Program{
		static void Main(string[] args)
        {
			String Ccx = @"SERVER=127.0.0.1;DATABASE=basecible;PORT=3306;UID=username;PASSWORD=passwordaccess;"
			MySqlConnection Dba = new MySqlConnection(Ccx);
			Dba.Open();

			MySqlCommand Cmd = new MySqlCommand("INSER INTO users VALUES('john',NOW(),'super commentaire')", Dba,null); 
			Cmd.CommandTimeout = 300;
			Cmd.ExecuteNonQuery();
			Dba.Close();
		}
	}
}

A noter qu'aucun système ne permet de préparer et donc de sécuriser votre requête comme c'est le cas en PHP, il vous faudra donc vous en occuper en amont de l'éxécution de la requête SQL

INSERT SQL en Csharp :

 

Pour réaliser une requête INSERT INTO SQL en Csharp, l'approche est très similaire à celle pour le MySQL. On définit une chaine de connexion, puis on ouvre la connexion avec la base de données SQL. On écrit la requête, on l'exécute, on ferme la connexion à la base de données.

 

using MySql.Data.MySqlClient;

namespace Test{

	class Program{
		static void Main(string[] args)
        {
			String Ccx = @"Data Source=127.0.0.1\WEBSQL;Initial Catalog=Base_Cible;Persist Security Info=True;User ID=userDemo;Password=demo"
			MySqlConnection Dba = new SqlConnection(Ccx);
			Dba.Open();

			MySqlCommand Cmd = new SqlCommand("INSER INTO users VALUES('john',NOW(),'super commentaire')", Dba,null); 
			Cmd.CommandTimeout = 300;
			Cmd.ExecuteNonQuery();
			Dba.Close();
		}
	}
}

 

Vous savez maintenant comment utiliser les requêtes d'insertion en SQL aussi bien en C# qu'en PHP. Nous vous invitons maintenant à la plus grande prudence lors de la mise en oeuvre pour des applications publiques, car cette publication ne traite pas des aspects sécuritaires des INSERT SQL.