Dans MySQL, il existe un certain nombre de fonctions pour vous aider à travailler avec des documents JSON. Ceux-ci incluent JSON_SET()
, JSON_INSERT()
, et JSON_REPLACE()
fonctions.
Ces trois fonctions sont liées, mais elles diffèrent légèrement.
Syntaxe
Tout d'abord, voici la syntaxe des trois fonctions :
JSON_SET(json_doc, chemin, val[, chemin, val] ...)JSON_INSERT(json_doc, chemin, val[, chemin, val] ...)JSON_REPLACE(json_doc, chemin, val[, chemin, val] ...)
Les trois fonctions acceptent donc les mêmes arguments. Voici à quoi servent ces arguments :
json_doc
est le document JSON.path
est le chemin de l'élément pour lequel insérer des données ou mettre à jour la valeur.val
est la nouvelle valeur.
La différence
Voici la différence entre ces fonctions :
JSON_SET()
remplace les valeurs existantes et ajoute des valeurs inexistantes.JSON_INSERT()
insère des valeurs sans remplacer les valeurs existantes.JSON_REPLACE()
remplace uniquement les valeurs existantes.
Donc, fondamentalement, celui que vous utilisez dépend si vous mettez à jour une valeur existante ou en insérez une nouvelle (bien que JSON_SET()
fait les deux).
Exemple 1 - Insérer une valeur
Voici des exemples pour démontrer la différence entre ces trois fonctions.
JSON_SET()
Voici ce qui se passe si nous essayons d'insérer une nouvelle valeur en utilisant JSON_SET()
:
SELECT JSON_SET('{"a":1, "b":2}', '$.c', 3) AS 'Résultat' ;
Résultat :
+-----------------------------------+| Résultat |+--------------------------+| {"a":1, "b":2, "c":3} |+--------------------------+Cela a donc parfaitement fonctionné.
JSON_INSERT()
Voici ce qui se passe si nous essayons d'insérer une nouvelle valeur en utilisant
JSON_INSERT()
:SELECT JSON_INSERT('{"a":1, "b":2}', '$.c', 3) AS 'Résultat' ;Résultat :
+-----------------------------------+| Résultat |+--------------------------+| {"a":1, "b":2, "c":3} |+--------------------------+Exactement le même résultat qu'avec
JSON_SET()
.JSON_REPLACE()
Voici ce qui se passe si nous essayons d'insérer une nouvelle valeur en utilisant
JSON_REPLACE()
:SELECT JSON_REPLACE('{"a":1, "b":2}', '$.c', 3) AS 'Résultat' ;Résultat :
+------------------+| Résultat |+------------------+| {"a":1, "b":2} |+------------------+Dans ce cas, la nouvelle valeur n'a pas été insérée. Le document JSON d'origine est renvoyé tel quel. En effet, cette fonction remplace uniquement les valeurs existantes - elle n'en insère pas de nouvelles.
Exemple 2 - Mettre à jour une valeur existante
Maintenant, pour mettre à jour les valeurs existantes.
JSON_SET()
Voici ce qui se passe si nous essayons de mettre à jour une valeur existante en utilisant
JSON_SET()
:SELECT JSON_SET('{"a":1, "b":2}', '$.b', 3) AS 'Résultat' ;Résultat :
+------------------+| Résultat |+------------------+| {"a":1, "b":3} |+-----------------+Donc encore une fois, cela a parfaitement fonctionné. Nous avons réussi à mettre à jour la deuxième paire clé/valeur avec la nouvelle valeur.
JSON_INSERT()
Voici ce qui se passe si nous essayons de mettre à jour une valeur existante en utilisant
JSON_INSERT()
:SELECT JSON_INSERT('{"a":1, "b":2}', '$.b', 3) AS 'Résultat' ;Résultat :
+------------------+| Résultat |+------------------+| {"a":1, "b":2} |+------------------+Dans ce cas, la valeur existante n'a pas été mise à jour. Le document JSON est renvoyé tel quel. C'est parce que le
JSON_INSERT()
la fonction insère uniquement de nouvelles valeurs - elle ne met pas à jour les valeurs existantes.JSON_REPLACE()
Voici ce qui se passe si nous essayons de mettre à jour une valeur existante en utilisant
JSON_REPLACE()
:SELECT JSON_REPLACE('{"a":1, "b":2}', '$.b', 3) AS 'Résultat' ;Résultat :
+------------------+| Résultat |+------------------+| {"a":1, "b":3} |+-----------------+Il se met à jour parfaitement.