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.
INSERT ... SELECT
est présenté plus en
détails : See Section 13.1.4.1, « 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
Section 13.2.5, « 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-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. See Section 2.4.2, « 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
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. See
Section 13.1.4.2, « 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. See
Section 13.1.4.2, « Syntaxe de INSERT DELAYED
». 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. See
Section 14.1, « Le moteur de 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'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. Le
comportement des commandes INSERT
avec les
colonnes AUTO_INCREMENT
sont décrites dans
la section Section 12.8.3, « Fonctions d'informations » et
Section 24.2.3.33, « 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'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()
. See
Section 24.2.3.31, « mysql_info()
».
This is a translation of the 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.