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 :
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 :
|