No MySQL, há várias funções para ajudar você a trabalhar com documentos JSON. Isso inclui o
JSON_SET()
, JSON_INSERT()
e JSON_REPLACE()
funções. Essas três funções estão relacionadas, mas diferem um pouco.
Sintaxe
Primeiro, aqui está a sintaxe para todas as três funções:
JSON_SET(json_doc, path, val[, path, val] ...)JSON_INSERT(json_doc, path, val[, path, val] ...)JSON_REPLACE(json_doc, path, val[, path, val] ...)
Portanto, todas as três funções aceitam os mesmos argumentos. Veja para que servem esses argumentos:
json_doc
é o documento JSON.path
é o caminho do elemento para o qual inserir dados ou atualizar o valor.val
é o novo valor.
A diferença
Aqui está a diferença entre essas funções:
JSON_SET()
substitui valores existentes e adiciona valores inexistentes.JSON_INSERT()
insere valores sem substituir valores existentes.JSON_REPLACE()
substitui apenas os valores existentes.
Então, basicamente, qual você usa depende se você está atualizando um valor existente ou inserindo um novo (embora
JSON_SET()
faz os dois). Exemplo 1 – Inserir um valor
Aqui estão exemplos para demonstrar a diferença entre essas três funções.
JSON_SET()
Aqui está o que acontece se tentarmos inserir um novo valor usando
JSON_SET()
:SELECT JSON_SET('{"a":1, "b":2}', '$.c', 3) AS 'Result';
Resultado:
+--------------------------+| Resultado |+--------------------------+| {"a":1, "b":2, "c":3} |+--------------------------+
Então funcionou perfeitamente.
JSON_INSERT()
Veja o que acontece se tentarmos inserir um novo valor usandoJSON_INSERT()
:
SELECT JSON_INSERT('{"a":1, "b":2}', '$.c', 3) AS 'Result';
Resultado:
+--------------------------+| Resultado |+--------------------------+| {"a":1, "b":2, "c":3} |+--------------------------+
Exatamente o mesmo resultado que comJSON_SET()
.
JSON_REPLACE()
Veja o que acontece se tentarmos inserir um novo valor usandoJSON_REPLACE()
:
SELECT JSON_REPLACE('{"a":1, "b":2}', '$.c', 3) AS 'Resultado';
Resultado:
+------------------+| Resultado |+------------------+| {"a":1, "b":2} |+------------------+
Neste caso, o novo valor não foi inserido. O documento JSON original é retornado inalterado. Isso ocorre porque essa função apenas substitui valores existentes – ela não insere novos.
Exemplo 2 – Atualizar um valor existente
Agora para atualizar os valores existentes.
JSON_SET()
Aqui está o que acontece se tentarmos atualizar um valor existente usandoJSON_SET()
:
SELECT JSON_SET('{"a":1, "b":2}', '$.b', 3) AS 'Result';
Resultado:
+------------------+| Resultado |+------------------+| {"a":1, "b":3} |+------------------+
Então, novamente, funcionou perfeitamente. Atualizamos com sucesso o segundo par chave/valor com o novo valor.
JSON_INSERT()
Veja o que acontece se tentarmos atualizar um valor existente usandoJSON_INSERT()
:
SELECT JSON_INSERT('{"a":1, "b":2}', '$.b', 3) AS 'Resultado';
Resultado:
+------------------+| Resultado |+------------------+| {"a":1, "b":2} |+------------------+
Neste caso, o valor existente não foi atualizado. O documento JSON é retornado inalterado. Isso ocorre porque oJSON_INSERT()
A função apenas insere novos valores – ela não atualiza os existentes.
JSON_REPLACE()
Veja o que acontece se tentarmos atualizar um valor existente usandoJSON_REPLACE()
:
SELECT JSON_REPLACE('{"a":1, "b":2}', '$.b', 3) AS 'Resultado';
Resultado:
+------------------+| Resultado |+------------------+| {"a":1, "b":3} |+------------------+
Atualiza perfeitamente.