Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comportement MySQL de ON DUPLICATE KEY UPDATE pour plusieurs champs UNIQUE

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é.