2013-08-15 4 views
1

Dire que j'ai un champ de texte avec des données JSON comme celui-ci:valeur d'incrément MySQL dans un champ texte

{ 
    "id": { 
     "name": "value", 
     "votes": 0 
    } 
} 

Est-il possible d'écrire une requête qui trouverait id et serait alors augmenter la valeur votes?

Je sais que je pourrais juste récupérer la mise à jour de données de JSON ce dont j'ai besoin et réinsérer la version mise à jour, mais je me demande est là un moyen de faire ceci sans courir deux requêtes?

+0

Il n'y a pas un moyen facile ou efficace de le faire. Si vous en avez besoin, la base de données relationnelle n'est pas pour vous. –

+0

Pourquoi est-ce tagué MySQL? Les données sont-elles stockées dans une base de données? –

+0

@ N.B. Oui, je sais que c'est une façon stupide de le faire, mais c'est quelque chose qui ne sera pas souvent utilisé et cela augmenterait la performance d'autres choses que je fais. – Linas

Répondre

0

Je pense que pour une tâche comme celle-ci, vous êtes coincé en utilisant un SELECT simple suivi d'un UPDATE (après avoir analysé le JSON, incrémentez la valeur souhaitée, puis sérialiser le JSON).

Vous devriez envelopper ces opérations dans une seule transaction, et si vous utilisez InnoDB alors vous pourriez aussi envisager d'utiliser SELECT ... FOR UPDATE: http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

C'est un peu une tangente, mais je pensais que je vous signale aussi que C'est le type d'opération qu'une base de données NoSQL comme MongoDB est assez bonne.

1
UPDATE `sometable` 
    SET `somefield` = JSON_REPLACE(`somefield`, '$.id.votes', JSON_EXTRACT(`somefield` , '$.id.votes')+1) 
    WHERE ... 

Modifier

As of MySQL 5.7.8, MySQL prend en charge un type de données JSON natif qui permet un accès efficace aux données dans les documents JSON.

JSON_EXTRACT vous permettra d'accéder à un élément JSON particulier dans un champ JSON, tandis que JSON_REPLACE vous permettra de le mettre à jour.

Pour spécifier l'élément JSON vous souhaitez accéder, utiliser une chaîne avec le format

'$.[top element].[sub element].[...]' 

Donc, dans votre cas, pour accéder id.votes, utilisez la chaîne « $ .id.votes '.

Le code SQL qui précède démontre mettre tout cela ensemble pour augmenter la valeur d'un champ JSON par 1.

+0

Veuillez expliquer pourquoi vous pensez que ce code aide le PO. Cela aidera à la fois le PO et les futurs visiteurs. – Bugs

+1

Bien que cet extrait de code soit le bienvenu, et qu'il puisse fournir de l'aide, il serait [grandement amélioré s'il comprenait une explication] (// meta.stackexchange.com/q/114762) de * comment * et * pourquoi * cela résout le problème. problème. Rappelez-vous que vous répondez à la question pour les lecteurs dans le futur, pas seulement pour la personne qui demande maintenant! S'il vous plaît [modifier] votre réponse pour ajouter une explication, et donner une indication des limites et des hypothèses qui s'appliquent. –