Comment Effectuer un UPSERT de sorte que je peux utiliser à la fois les nouvelles et les anciennes valeurs dans la mise à jour de la partie

Stupide, mais simple exemple:
Supposons que j'ai une table "Article" où je garde les totaux de tous les éléments.

Item_Name              Items_In_Stock

Nom de l'élément primaire est la clé ici. Comment puis-je atteindre les objectifs suivants lorsque j'ai jamais recevoir Un élément en quantité X.

Si l'élément n'existe pas, j'ai insérer un nouveau fichier pour le Point A et le les articles en stock de X et si il existe un dossier où les articles en stock Y a ensuite la nouvelle valeur dans les articles en stock (X + Y)

INSERT INTO `item`
(`item_name`, items_in_stock)
VALUES( 'A', 27)
ON DUPLICATE KEY UPDATE
`new_items_count` = 27 + (SELECT items_in_stock where item_name = 'A' )

Mon problème est que j'ai plusieurs colonnes dans ma table. Est-ce une bonne idée d'écrire plusieurs instructions select dans la mise à jour de la partie?

Bien sûr, je peux le faire dans le code, mais est-il un meilleur moyen?

  • Pourquoi voudriez-vous utiliser une sous-requête dans votre exemple? Vous pourriez juste ON DUPLICATE KEY UPDATE new_items_count = new_items_count + 27. En voyant que vous ne publiez pas d'autres colonnes, il est difficile de répondre à votre question, parce que le comportement attendu est inconnu. Que faites-vous avec les autres colonnes? La mise à jour de certains numéros ou?
  • Grand. C'est la réponse à la question. Je ne savais pas que je peux utiliser le nom de la colonne à la place de la sous-requête. Si vous le publiez, comme réponse, je vais l'accepter comme réponse.
  • Il y a un rubis de la bibliothèque qui définit une fonction MySQL: github.com/seamusabshere/upsert
  • qu'est-ce que new_items_count ici? est-ce une autre colonne sur votre table?