W MySQL dostępnych jest wiele funkcji ułatwiających pracę z dokumentami JSON. Należą do nich JSON_SET()
, JSON_INSERT()
i JSON_REPLACE()
funkcje.
Te trzy funkcje są ze sobą powiązane, ale nieznacznie się różnią.
Składnia
Po pierwsze, oto składnia wszystkich trzech funkcji:
JSON_SET(json_doc, path, val[, path, val] ...) JSON_INSERT(json_doc, path, val[, path, val] ...) JSON_REPLACE(json_doc, path, val[, path, val] ...)
Więc wszystkie trzy funkcje akceptują te same argumenty. Oto, do czego służą te argumenty:
json_doc
jest dokumentem JSON.path
jest ścieżką elementu, dla którego należy wstawić dane lub zaktualizować wartość.val
to nowa wartość.
Różnica
Oto różnica między tymi funkcjami:
JSON_SET()
zastępuje istniejące wartości i dodaje nieistniejące wartości.JSON_INSERT()
wstawia wartości bez zastępowania istniejących wartości.JSON_REPLACE()
zastępuje tylko istniejące wartości.
Zasadniczo więc to, którego używasz, zależy od tego, czy aktualizujesz istniejącą wartość, czy wstawiasz nową (chociaż JSON_SET()
robi jedno i drugie).
Przykład 1 – Wstaw wartość
Oto przykłady pokazujące różnicę między tymi trzema funkcjami.
JSON_SET()
Oto, co się stanie, jeśli spróbujemy wstawić nową wartość za pomocą JSON_SET()
:
SELECT JSON_SET('{"a": 1, "b": 2}', '$.c', 3) AS 'Result';
Wynik:
+--------------------------+ | Result | +--------------------------+ | {"a": 1, "b": 2, "c": 3} | +--------------------------+
Więc zadziałało idealnie.
JSON_INSERT()
Oto, co się stanie, jeśli spróbujemy wstawić nową wartość za pomocą JSON_INSERT()
:
SELECT JSON_INSERT('{"a": 1, "b": 2}', '$.c', 3) AS 'Result';
Wynik:
+--------------------------+ | Result | +--------------------------+ | {"a": 1, "b": 2, "c": 3} | +--------------------------+
Dokładnie taki sam wynik jak w przypadku JSON_SET()
.
JSON_REPLACE()
Oto, co się stanie, jeśli spróbujemy wstawić nową wartość za pomocą JSON_REPLACE()
:
SELECT JSON_REPLACE('{"a": 1, "b": 2}', '$.c', 3) AS 'Result';
Wynik:
+------------------+ | Result | +------------------+ | {"a": 1, "b": 2} | +------------------+
W tym przypadku nowa wartość nie została wstawiona. Oryginalny dokument JSON jest zwracany bez zmian. Dzieje się tak, ponieważ ta funkcja zastępuje tylko istniejące wartości – nie wstawia nowych.
Przykład 2 – Aktualizacja istniejącej wartości
Teraz do aktualizacji istniejących wartości.
JSON_SET()
Oto, co się stanie, jeśli spróbujemy zaktualizować istniejącą wartość za pomocą JSON_SET()
:
SELECT JSON_SET('{"a": 1, "b": 2}', '$.b', 3) AS 'Result';
Wynik:
+------------------+ | Result | +------------------+ | {"a": 1, "b": 3} | +------------------+
Więc znowu zadziałało idealnie. Pomyślnie zaktualizowaliśmy drugą parę klucz/wartość o nową wartość.
JSON_INSERT()
Oto, co się stanie, jeśli spróbujemy zaktualizować istniejącą wartość za pomocą JSON_INSERT()
:
SELECT JSON_INSERT('{"a": 1, "b": 2}', '$.b', 3) AS 'Result';
Wynik:
+------------------+ | Result | +------------------+ | {"a": 1, "b": 2} | +------------------+
W tym przypadku istniejąca wartość nie została zaktualizowana. Dokument JSON jest zwracany bez zmian. Dzieje się tak, ponieważ JSON_INSERT()
funkcja wstawia tylko nowe wartości – nie aktualizuje już istniejących.
JSON_REPLACE()
Oto, co się stanie, jeśli spróbujemy zaktualizować istniejącą wartość za pomocą JSON_REPLACE()
:
SELECT JSON_REPLACE('{"a": 1, "b": 2}', '$.b', 3) AS 'Result';
Wynik:
+------------------+ | Result | +------------------+ | {"a": 1, "b": 3} | +------------------+
Aktualizuje się doskonale.