78 votes

INSÉRER DANS .. EN CAS DE DOUBLON METTRE À JOUR POUR PLUSIEURS ÉLÉMENTS

Je veux faire quelque chose comme ça

INSERT INTO t (t.a, t.b, t.c) 
VALUES ('clé1', 'clé2', 'valeur') 
ON DUPLICATE KEY UPDATE 
t.c = 'valeur';
INSERT INTO t (t.a, t.b, t.c) 
VALUES ('clé1', 'clé3', 'valeur2') 
ON DUPLICATE KEY UPDATE 
t.c = 'valeur2';

t.a et t.b sont des clés. Tout fonctionne bien mais j'obtiens une erreur sur la deuxième insertion. Avec phpMyAdmin, une requête comme celle-ci fonctionne bien mais je suppose qu'elle exécute les requêtes de manière indépendante car elle imprime les résultats de cette requête sous forme de commentaires?

Quelque chose comme ça serait bien aussi, mais j'aurai besoin d'avoir des valeurs différentes pour chaque élément. Je préfère cela mais je ne suis pas sûr comment je peux changer la valeur lors de la mise à jour pour chaque valeur.

INSERT INTO t (t.a, t.b, t.c)
VALUES ('clé1', 'clé2', 'valeur'), ('clé1', 'clé3', 'valeur2')
ON DUPLICATE KEY UPDATE
t.c = ???

Le problème se trouve dans les points d'interrogation, que dois-je mettre là pour que chaque insertion/mise à jour ait la valeur correcte? Évidemment, si je mets une valeur là-bas, tous les champs obtiendront cette valeur.

S'il existe une autre façon de faire une requête "mise à jour si existe, sinon insérer" sur plusieurs champs avec deux clés, je suis ouvert à d'autres idées aussi. Je suppose que je pourrais exécuter chaque requête séparément (comme phpMyAdmin?) mais cela va impliquer beaucoup de requêtes donc je préfère vraiment éviter cela.

169voto

ʞɔıu Points 15907

Utilisez la fonction VALUES()

INSERT INTO t (t.a, t.b, t.c)
VALUES ('clé1','clé2','valeur'), ('clé1','clé3','valeur2')
ON DUPLICATE KEY UPDATE
t.c = VALUES(t.c)

voir http://dev.mysql.com/doc/refman/5.0/fr/insert-on-duplicate.html

3 votes

Mysql> INSÉRER DANS paramètre(id,num) VALEURS(3,4) SUR DUPPLICATE KEY UPDATE id=VALUES(d)+222; Requête OK, 2 lignes affectées (0.67 sec)

0 votes

Donc essentiellement, les valeurs font référence aux mêmes valeurs insérées mais relativement, bien sûr, à chaque ligne insérée

50voto

datamafia Points 381

Trop peu de réputation pour commenter, mais je voulais ajouter une syntaxe légèrement plus complexe qui a été inspirée par la réponse de @ʞɔıu. Pour mettre à jour plusieurs champs sur une clé en double :

INSERT INTO t (t.a, t.b, t.c, t.d)
VALUES ('key1','key2','valeur','valeurb'), ('key1','key3','valeur2','valeur2b')
ON DUPLICATE KEY UPDATE
t.c = VALUES(t.c),
t.d = VALUES(t.d)

3voto

Hunger Points 326

Après MySQL 8.0.19, vous pouvez utiliser le mot-clé as, par exemple :

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;

ou

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;

ref: https://dev.mysql.com/doc/refman/8.0/fr/insert-on-duplicate.html

0voto

gns Points 1

Fais quelque chose comme ça

INSERT INTO about_company ( id, orgId, authorisedCapital, paidUpCapital, registeredAddress, entityClass, industry, subIndustry, listingStatus, dateOfLastAgm, dateOfIncorporation, activeCompliance, eFilingStatus, updatedAt )

VALEURS ( 'U74999DL2019PTC3459XZ', '65a9007e09fdf2002810f537', '10000', '2110', 'YO Yo12', 'Privé', 'Non coté', '2023-09-30', '2013-08-05', 'conforme ACTIF', 'Actif', '2024-01-28 01:29:47' ),

( 'U74999DL2019PTC3459XX', '65a9007e09fdf2002810f537', '10000', '22210', 'HoneySingh12', 'Privé', 'Non coté', '2023-09-30', '2013-08-05', 'conforme ACTIF', 'Actif', '2024-01-29 01:29:47' )

EN CAS DE DOUBLON MISE À JOUR

updatedAt = VALEURS(updatedAt),

registeredAddress = VALEURS(registeredAddress);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X