REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] VALUES ({expr | DEFAULT},...),(...),...
ou :
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name SET col_name={expr | DEFAULT}, ...
ou :
REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] SELECT ...
REPLACE
fonctionne exactement comme
INSERT
, sauf que si une vieille ligne dans la
table à la même valeur qu'une nouvelle pour un index
UNIQUE
ou une PRIMARY KEY
,
la vielle ligne sera effacée avant que la nouvelle ne soit
insérée. See Section 13.1.4, « Syntaxe de INSERT
».
En d'autres termes, vous ne pouvez pas accéder aux valeurs de
l'ancienne ligne à partir d'une requête
REPLACE
. Dans quelques vieilles versions de
MySQL, il apparaît que c'était possible, mais c'etait un
dysfonctionnement qui a été corrigé depuis.
Pour utiliser REPLACE
vous devez avoir les
privilèges INSERT
et
DELETE
sur la table.
Quand vous utilisez une commande REPLACE
,
mysql_affected_rows()
retournera 2 si une
nouvelle ligne en remplace une existante, et cela parce qu'il y
aura eu une insertion puis une suppression.
Cela aide à savoir si REPLACE
a ajouté ou a
remplacé une ligne : Testez si le nombre de lignes affectées
est égal à 1 (ajout) ou s'il est égal à 2 (remplacement).
Notez que si vous n'utilisez pas un index
UNIQUE
ou une PRIMARY KEY
,
utiliser un REPLACE
n'a pas de sens vu que
cela revient à utiliser un INSERT
. Il
devient équivalent à INSERT
, car il n'y a
pas d'index à utiliser pour déterminer si un nouvelle ligne
est un double d'une autre.
Voici quelques détails sur l'algorithme utilisé : Il est
aussi utilisé par LOAD DATA ... REPLACE
.
Insertion de la ligne dans la table
Si une erreur de clé dupliqué ou de clé unique ou de clé primaire survient :
Annuler les changements de clés
Essayer à nouveau d'insérer la clé primaire et unique dans la table
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.