| 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  
 ou :| 
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, ... ]
 | 
 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 [LOW_PRIORITY | DELAYED] [IGNORE][INTO] tbl_name [(col_name,...)]
 SELECT ...
 | 
 
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: 
Les valeurs des colonnes peuvent être spécifiées de plusieurs façons :  
 Les commandes  
INSERT
  supportent les options suivantes :
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.
 
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 : 
 Note :
  si la colonne  
b
  est aussi unique, la commande
 
UPDATE
  sera réécrite telle que| 
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;
 | 
 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.| 
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
 | 
 
Exemple :
 La commande ci-dessus est identique à :| 
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)-> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
 | 
 Lors de l'utilisation de  
ON DUPLICATE KEY UPDATE
 , l'option 
 
DELAYED
  est ignorée.| 
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;
 | 
 
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
  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:| 
Records: 100 Duplicates: 0 Warnings: 0
 | 
 
Si vous utilisez l'interface C, la chaîne d'information peut être obtenue
en invoquant la fonction  
mysql_info()
 .
 
mysql_info()
 .
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.
   Sommaire : |