Syntaxe de HANDLER
<<<
Syntaxe de INSERT Syntaxe de LOAD DATA INFILE
>>>

14.1 Manipulation de données : SELECT , INSERT , UPDATE , DELETE
14 Syntaxe des commandes SQL
 Manuel de Référence MySQL 4.1 : Version Française

Syntaxe de DELETE
Syntaxe de DO
Syntaxe de HANDLER
->Syntaxe de INSERT
Syntaxe de LOAD DATA INFILE
Syntaxe de REPLACE
Syntaxe de SELECT
Sous-sélections ( SubSELECT )
Syntaxe de TRUNCATE
Syntaxe de UPDATE

14.1.4 Syntaxe de INSERT


INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    VALUES ({expr | DEFAULT},...),(...),...
    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
ou :

INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
    [INTO] tbl_name
    SET col_name={expr | DEFAULT}, ...
    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
ou :

INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    SELECT ...
INSERT insère une nouvelle ligne dans une table existante. La syntaxe INSERT ... VALUES insère une ligne à partir de valeurs explicitement fournies. La syntaxe INSERT ... SELECT insère des valeurs à partir d'une autre table. La syntaxe INSERT ... VALUES avec plusieurs valeurs est supportées à partir de MySQL Version 3.22.5 ou supérieure. la syntaxe nom_colonne=expression est supportée à partir de la version 3.22.10 de MySQL.

INSERT ... SELECT est présenté plus en détails : Syntaxe de INSERT ... SELECT .

nom_de_table est le nom de la table dans laquelle les valeurs seront insérées. La liste de noms de colonne ou la clause SET indiquent les colonnes qui seront affectées:
  • La liste des noms de colonnes ou la clause SET indique explicitement les colonnes utilisées.
  • Si vous ne spécifiez pas de liste de colonnes avec INSERT ... VALUES ou INSERT ... SELECT , les valeurs pour toutes les colonnes doivent être fournies dans la clause VALUES() ou par la commande SELECT . Si vous ne connaissez pas l'ordre des colonnes, utilisez la commande DESCRIBE nom_de_table pour le connaître.
Les valeurs des colonnes peuvent être spécifiées de plusieurs façons :
  • A chaque fois qu'on ne donne pas explicitement une valeur pour une colonne, celle prend la valeur par défaut. Par exemple, si on définit une liste de colonnes qui ne compte pas toutes les colonnes de la tables, toutes les colonnes qui ne sont pas nommées prendront leur valeur par défaut. La définition de la valeur par défaut se fait avec Syntaxe de CREATE TABLE .MySQL a toujours une valeur par défaut pour chaque champs. C'est obligatoire pour MySQL pour pouvoir fonctionner aussi bien avec des tables supportant les transactions qu'avec des tables ne les supportant pas.

    Nous pensons que le contrôle du contenu des champs devrait être fait pas l'application et non par le serveur de base de données.

    Note : si vous voulez que les commandes INSERT génèrent une erreur si vous ne spécifiez pas explicitement de valeur pour toutes les colonnes qui requièrent des valeurs non- NULL , vous pouvez auss configurer MySQL avec l'option DONT_USE_DEFAULT_FIELDS . Ce comportement n'est pas disponible si vous compilez MySQL depuis le source. Les options habituelles de configure .
  • Vous pouvez utiliser le mot clé DEFAULT pour donner explicitement à une colonne sa valeur par défaut. Cette fonctionnalité a été ajoutée en MySQL version 4.0.3. Cela rend plus simple l'écriture de commandes INSERT lors de l'assignation de quelques colonnes, sans écrire de valeurs VALUES incomplètes. Sinon, il faut écrire la liste des colonnes utilisées pour chaque valeur de la liste VALUES .
  • Si la liste de colonnes et de valeurs VALUES sont vides, INSERT crée une ligne pour chaque colonne avec sa valeur par défaut :
    
    mysql> INSERT INTO tbl_name () VALUES();
    
  • Une expression peut faire référence à n'importe quelle colonne qui a été définie précédemment dans une liste de valeurs. Par exemple, on peut dire ceci :
    
    mysql> INSERT INTO nom_de_table (col1,col2) VALUES(15,col1*2);
    
    Mais vous ne pouvez pas faire cela, car la valeur de col1 fait référence à col2 , qui est assigné après col1 :
    
    mysql> INSERT INTO nom_de_table (col1,col2) VALUES(col2*2,15);
    
Les commandes INSERT supportent les options suivantes :
  • Si vous spécifiez l'option DELAYED , le serveur met la ligne ou les lignes à insérer dans un buffer, et le client qui a émis la commande INSERT DELAYED est immédiatement libéré. Si la table est occupée, le serveur conserve les lignes. Lorsque la table se libère, il va insérer les lignes, tout en vérifiant périodiquement s'il n'y a pas de lectures dans la table. Si une lecture arrive, l'insertion est suspendue jusqu'à la prochaine libération. Syntaxe de INSERT DELAYED .
  • Si on spécifie le mot LOW_PRIORITY , l'exécution de INSERT sera retardé jusqu'à ce qu'il n'y ait plus de clients qui lisent la table. Dans ce cas le client doit attendre jusqu'à la fin de l'opération d'insertion, ce qui peut prendre beaucoup de temps si la table est fréquemment accédée. C'est la grande différence avec INSERT DELAYED , qui laisse le client continuer tout de suite. Syntaxe de INSERT DELAYED . On peut remarquer que LOW_PRIORITY ne devrait en principe pas être utiliser avec des tables de type MyISAM , étant donné que celles-ci n'autorisent pas les insertions simultanées. Tables MyISAM .
  • Si on spécifie le mot IGNORE dans un INSERT avec les valeurs de plusieurs lignes, chaque ligne qui qui ferait doublon avec une clé PRIMARY ou UNIQUE existante dans la table sera ignoré et ne sera pas insérée. Si on ne spécifie pas IGNORE , l'insert est abandonné si quelque ligne que ce soit fait doublon avec une clé existante. La fonction mysql_info() de l'API C permet de savoir combien de lignes ont été insérées dans la table.

Si vous spécifiez la clause ON DUPLICATE KEY UPDATE (nouveau en MySQL 4.1.0), et qu'une ligne insérée engendre un doublon pour une clé PRIMARY ou UNIQUE , une commande UPDATE sera faite à la place de l'insertion. Par exemple, les commandes ont le même effet :


mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
    -> ON DUPLICATE KEY UPDATE c=c+1;

mysql> UPDATE table SET c=c+1 WHERE a=1;
Note : si la colonne b est aussi unique, la commande UPDATE sera réécrite telle que

mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
Si a=1 OR b=2 trouve plusieurs lignes, uniquement une ligne sera mise à jour! En général, il faut éviter d'utiliser la clause ON DUPLICATE KEY sur des tables avec des clés UNIQUE multiples.Depuis MySQL version 4.1.1, on peut utiliser la fonction VALUES(col_name) pour faire référence à la valeur de la colonne dans la clause INSERT d'une commande INSERT ... UPDATE : c'est la valeur qui serat inserée s'il n'y a pas de conflit de clé. Cette valeur est particulièrement utilise dans les commandes INSERT ... UPDATE et retourne NULL sinon.

Exemple :


mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
    -> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
La commande ci-dessus est identique à :

mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
    -> ON DUPLICATE KEY UPDATE c=3;
mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)
    -> ON DUPLICATE KEY UPDATE c=9;
Lors de l'utilisation de ON DUPLICATE KEY UPDATE , l'option DELAYED est ignorée.

Vous pouvez trouver la valeur utilisée pour une colonne AUTO_INCREMENT en utilisant la fonction LAST_INSERT_ID() . Depuis l'interface C, utilisez la fonction mysql_insert_id() . Cependant, notez que les deux fonctions ne se comportement pas de la la même façons dans toutes les circonstances. Le comportement des commandes INSERT avec les colonnes AUTO_INCREMENT sont décrites dans la section Fonctions d'informations et mysql_insert_id() .

Si vous utilisez une commande INSERT ... VALUES avec plusieurs listes de valeurs ou INSERT ... SELECT , la commande retourne les informations sous ce format :

Records: 100 Duplicates: 0 Warnings: 0
Records indique le nombre de ligne qui ont été traitées par cette commande. Ce n'est pas forcément le nombre de ligne insérées. Duplicates peut être non-nulle. Duplicates indique le nombre de lignes qui n'ont pas peut être insérées pour cause de conflit avec une clé unique existante. Warnings indique le nombre de tentatives d'inserts de valeurs dans une colonne qui ont généré des problèmes. Les Warnings peuvent apparaître dans les conditions suivantes:
  • Insertion de NULL dans une colonne déclarée NOT NULL . Pour les commandes d'insertions multiples INSERT ou les commandes INSERT ... SELECT , la colonne prend la valeur par défaut adaptée au type de colonne. C'est 0 pour les types numériques, la chaîne vide pour les textes et la valeur ``zéro'' pour les types temporels
  • Enregistrement dans une colonne numérique d'une valeur qui déborde de la taille de la colonnes. Cette valeur a été tronquée à l'extrémité la plus adaptée de la colonne.
  • Attribution à une colonne numérique d'une valeur telle que '10.34 a' . Celle valeur refusée est séparée, et la partie numérique résultante est insérée. Si cette valeur n'a pas une valeur numérique sensée, la valeur 0 est insérée.
  • L'insertion d'une chaîne dans une colonne CHAR , VARCHAR , TEXT , ou BLOB qui dépasse la taille maximale de la colonne. La valeur est tronquée à la taille maximale de la colonne.
  • L'insertion d'une valeur illégale pour une colonne de type date ou time. La colonne est alors enregistrée avec la valeur de zero appropriée pour le type.

Si vous utilisez l'interface C, la chaîne d'information peut être obtenue en invoquant la fonction mysql_info() . mysql_info() .

Sommaire :

<< Syntaxe de INSERT >>
Syntaxe de HANDLER Manipulation de données : SELECT , INSERT , UPDATE , DELETE Syntaxe de LOAD DATA INFILE