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 3.22.5 ou supérieure. la
syntaxe nom_colonne=expression est supportée
à partir de la version 3.22.10
de MySQL.
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.
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-nulles (NULL), vous
pouvez aussi configurer MySQL avec
l'option DONT_USE_DEFAULT_FIELDS.
Ce comportement n'est pas disponible
si vous compilez MySQL depuis le source.
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 tampon, 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.
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. On peut remarquer que, en
principe, LOW_PRIORITY ne devrait
pas être utilisé avec
des tables de type MyISAM, étant
donné que celles-ci n'autorisent
pas les insertions simultanées.
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'insertion
est abandonnée 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 sera
insérée s'il n'y a pas
de conflit de clé. Cette valeur
est particulièrement utile
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.
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'insertion 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 zéro 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 Reference Manual that can
be found at dev.mysql.com. The original
Reference Manual is in English, and
this translation is not necessarily
as up to date as the English version.
|