web-dev-qa-db-fra.com

Existe-t-il un moyen d'utiliser ON DUPLICATE KEY pour mettre à jour tout ce que je voulais insérer?

Je sais que vous pouvez utiliser ON DUPLICATE KEY UPDATE pour mettre à jour une certaine valeur s'il existe déjà un enregistrement pour cette clé,

Je peux le faire:

INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1, 2, 3)
ON DUPLICATE KEY UPDATE `a`=1, `b`=2, `c`=3

Mais comment faire sans avoir à écrire deux fois les colonnes et les valeurs?

67
Neal

Malheureusement non.

Vous pouvez y arriver à mi-chemin sans avoir à répéter la valeur:

INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE `a`=VALUES(`a`), `b`=VALUES(`b`), `c`=VALUES(`c`);

Mais vous devez toujours lister les colonnes.

utilisation REPLACE INTO

Le sens de REPLACE INTO signifie que SI le nouvel enregistrement présente de nouvelles valeurs clés, il sera inséré en tant que nouvel enregistrement.

SI le nouvel enregistrement a des valeurs de clé qui correspondent à un enregistrement préexistant, alors la violation de clé sera ignorée et le nouvel enregistrement sera remplacer l'enregistrement préexistant.

38
user319198

Si c'est utile, j'ai fait une requête pour éviter d'écrire à la main la dernière partie de la requête "en double", pour les versions> = 5.0:

SELECT GROUP_CONCAT( CONCAT(COLUMN_NAME,"=values(", COLUMN_NAME,")") SEPARATOR ", ") FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'database_name' AND TABLE_NAME = 'table_name';

et sa sortie est la suivante:

a=values(a), b=values(b), c=values(c), d=values(d)

sur une table qui a les colonnes a, b, c et d, vous pouvez donc ajouter à la première partie de la requête:

INSERT INTO `tableName` (`a`,`b`,`c`, `d`) VALUES (1,2,3,4) ON DUPLICATE KEY UPDATE a=values(a), b=values(b), c=values(c), d=values(d)

MISE À JOUR: Pour une très longue liste de colonnes, vous pouvez voir une sortie tronquée, vous pouvez utiliser cette instruction avant la requête ci-dessus (merci Oncle iroh ):

SET SESSION group_concat_max_len = 1000000;
12
Javier P

je sais que c'est une vieille question, et c'est une réponse quelque peu non conventionnelle, mais j'ai rencontré la même chose et j'avais des problèmes avec la définition de la propriété group_concat_max_len mentionnée dans une autre réponse et obtenais toujours un résultat tronqué. Une autre option que j'ai finalement choisie lors de l'écriture d'un long script était d'utiliser cette formule dans Excel:

=SUBSTITUTE(TRIM(A1), ",", "") & " = VALUES(" & SUBSTITUTE(TRIM(A1), ",", "") & "),"

où A1 est la cellule dans laquelle vous copiez le nom du champ. Pour ce faire rapidement, je clique avec le bouton droit sur le tableau et copie l'instruction select dans le presse-papiers, qui vous donne tous les noms des colonnes, la formule supprime les virgules.

J'espère que cela aide quelqu'un!

0
hyphen