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 (Sub SELECT ) . Syntaxe de TRUNCATE . Syntaxe de UPDATE
|
14.1.4 Syntaxe de INSERT
INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ((expression | DEFAULT),...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expression, ... ] ou INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)] SELECT ... ou INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name SET col_name=(expression | DEFAULT), ... [ ON DUPLICATE KEY UPDATE col_name=expression, ... ]
|
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.
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:
-
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.
-
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
.
Il est également possible d'utiliser le mot
DEFAULT
pour qu'une colonne
prenne sa valeur par défaut. (Nouveauté de MySQL 4.0.3) Il est ainsi plus simple
d'écrire des requêtes
INSERT
qui donnent des valeurs à toutes les colonnes
sauf quelques unes, car cela permet de ne pas avoir à écrire la liste incomplète
de
VALUES()
(une liste qui ne comprend pas une valeur pour chaque colonne
de la table). Sans cela, il faudrait écrire la liste des noms de colonnes correspondant
a chaque valeur de la liste
VALUES()
.
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.
-
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 pas cela :
mysql> INSERT INTO nom_de_table (col1,col2) VALUES(col2*2,15);
|
-
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.
-
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. INSERT DELAYED.
On peut remarquer que
LOW_PRIORITY
ne devrait en principe pas être utiliser avec des
tables de type
MyISAM
, étant donné que celle si n'autorisent pas les inserts
concurrents. 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, la commande :
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3) -> ON DUPLICATE KEY UPDATE c=c+1;
|
dans le cas où
a
est déclaré comme
UNIQUE
et contient
déjà
1
, revient à faire
mysql> UPDATE table SET c=c+1 WHERE a=1;
|
Notez :
que 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;
|
et 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.
-
Si MySQL a été configuré avec l'option
DONT_USE_DEFAULT_FIELDS
, les opérations
INSERT
génère une erreur tant que les valeurs de toutes les colonnes qui
attendent une valeur autre que
NULL
ne sont pas spécifiées explicitement.
Les options habituelles de
configure
.
-
Il est possible de récupérer la valeur utilisée pour une colonne
AUTO_INCREMENT
avec la
fonction
mysql_insert_id
.
mysql_insert_id()
.
Si on fait une opération
INSERT ... SELECT
ou
INSERT ... VALUES
avec plusieurs listes de valeurs, la fonction
mysql_info()
de l'API C
permet d'obtenir des informations relatives à la requête. Le format de la chaîne
d'information est la suivante:
Records: 100 Duplicates: 0 Warnings: 0
|
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
.
Cette colonne a été enregistrée avec sa valeur par défaut.
-
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 :
|