Considérez
INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
Si a et b sont UNIQUE
champs, UPDATE
se produit sur a = 1 OR b = 2
. Aussi lorsque la condition a = 1 OR b = 2
est remplie par deux entrées ou plus, la mise à jour n'est effectuée qu'une seule fois.
Ex ici table table avec Id et Nom UNIQUE
champs
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
Si la requête est
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7);
alors nous obtenons
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
qui viole l'unicité de l'identifiant et du nom. Maintenant avec
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
nous obtenons
Id Name Value
1 P 7
2 C 7
3 D 29
4 A 6
Le comportement sur plusieurs clés est le suivant
UPDATE
dans ON DUPLICATE KEY UPDATE
est effectué si l'un des UNIQUE
champ est égal à la valeur à insérer. Ici, UPDATE
est effectué sur Id = 1 OR Name = C
. Cela équivaut à
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C;
Et si je veux une seule mise à jour, pour l'une ou l'autre des clés
Peut utiliser UPDATE
déclaration avec LIMIT
mot-clé
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;
qui donnera
Id Name Value
1 P 7
2 C 3
3 D 29
4 A 6
Et si je veux une mise à jour uniquement si les valeurs des deux clés correspondent
Une solution consiste à ALTER TABLE
et faites la PRIMARY KEY
(ou l'unicité) fonctionnent sur les deux champs.
ALTER TABLE table
DROP PRIMARY KEY,
ADD PRIMARY KEY (Id, Name);
Maintenant, sur
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
nous obtenons
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
car aucun doublon (sur les deux clés) n'est trouvé.