Mysql
 sql >> Baza danych >  >> RDS >> Mysql

JSON_SET() vs JSON_INSERT() vs JSON_REPLACE() w MySQL:jaka jest różnica?

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ustaw strefę czasową w PHP i MySQL

  2. PHP PDO a zwykłe mysql_connect

  3. Błąd migracji Laravel:błąd składni lub naruszenie dostępu:1071 Podany klucz był za długi; maksymalna długość klucza to 767 bajtów

  4. Odpowiednik Laravel-5 „LIKE” (Eloquent)

  5. Jak znaleźć zduplikowane rekordy w MySQL