Манипуляции с типами данных MySQL JSON

задняя часть база данных MySQL JSON
Манипуляции с типами данных MySQL JSON

Обзор

Начиная с версии mysql 5.7.8, он поддерживает хранение данных и запрос структуры json, что показывает, что mysql также постоянно изучает и увеличивает преимущества базы данных nosql. Однако MySQL, в конце концов, является реляционной базой данных, и она по-прежнему неудобна при работе с неструктурированными данными, такими как json.

Создайте таблицу с полями JSON

Сначала создайте таблицу, содержащую поле в формате json:

CREATE TABLE table_name (
    id INT NOT NULL AUTO_INCREMENT, 
    json_col JSON,
    PRIMARY KEY(id)
);

В приведенном выше утверждении основное внимание уделяется полю json_col, а указанный тип данных — JSON.

Вставьте простые данные JSON

INSERT INTO
    table_name (json_col) 
VALUES
    ('{"City": "Galle", "Description": "Best damn city in the world"}');

Заявление SQL выше, задняя часть ЦЕННОСТИ основного внимания, так как формат данных json, необходимость в двойных кавычках идентификационной строки, поэтому используйте одинарные кавычки, обернутые позади потребностей ЦЕННОСТИ содержимого.

Вставьте сложные данные JSON

INSERT INTO table(col) 
VALUES('{"opening":"Sicilian","variations":["pelikan","dragon","najdorf"]}');

Здесь мы вставили массив json. В основном обратите внимание на проблему одинарных и двойных кавычек.

Изменить данные JSON

В предыдущем примере мы вставили несколько фрагментов данных JSON, но если мы хотим что-то изменить в данных JSON, как мы можем это сделать? Например, если мы добавляем элемент в массив вариантов, мы можем сделать это:

UPDATE myjson SET dict=JSON_ARRAY_APPEND(dict,'$.variations','scheveningen') WHERE id = 2;

В этом операторе SQL $match представляет поле JSON, проиндексированное в поле вариантов с помощью числа ., а затем добавляет элемент с помощью функции JSON_ARRAY_APPEND. Теперь мы выполняем оператор запроса:

SELECT * FROM myjson

Полученный результат:

+----+-----------------------------------------------------------------------------------------+
| id | dict                                                                                    |
+---+-----------------------------------------------------------------------------------------+
| 2  | {"opening": "Sicilian", "variations": ["pelikan", "dragon", "najdorf", "scheveningen"]} |
+----+-----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Чтобы узнать о методе получения данных JSON в MySQL, перейдите по официальной ссылке.JSON Path Syntax

создать индекс

Данные в формате MySQL JSON не могут быть проиндексированы напрямую, но вы можете обойти это, отделить данные для поиска, отделить столбец данных, а затем ввести индекс в этом поле. Вот официальный пример:

mysql> CREATE TABLE jemp (
    ->     c JSON,
    ->     g INT GENERATED ALWAYS AS (c->"$.id"),
    ->     INDEX i (g)
    -> );
Query OK, 0 rows affected (0.28 sec)

mysql> INSERT INTO jemp (c) VALUES
     >   ('{"id": "1", "name": "Fred"}'), ('{"id": "2", "name": "Wilma"}'),
     >   ('{"id": "3", "name": "Barney"}'), ('{"id": "4", "name": "Betty"}');
Query OK, 4 rows affected (0.04 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT c->>"$.name" AS name
     >     FROM jemp WHERE g > 2;
+--------+
| name   |
+--------+
| Barney |
| Betty  |
+--------+
2 rows in set (0.00 sec)

mysql> EXPLAIN SELECT c->>"$.name" AS name
     >    FROM jemp WHERE g > 2\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: jemp
   partitions: NULL
         type: range
possible_keys: i
          key: i
      key_len: 5
          ref: NULL
         rows: 2
     filtered: 100.00
        Extra: Using where
1 row in set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Note
   Code: 1003
Message: /* select#1 */ select json_unquote(json_extract(`test`.`jemp`.`c`,'$.name'))
AS `name` from `test`.`jemp` where (`test`.`jemp`.`g` > 2)
1 row in set (0.00 sec)

Этот пример очень простой, то есть поле id в поле JSON выносится отдельно в поле g, а потом индексируется по полю g, и условие запроса тоже по полю g.

Строка в формате JSON

Преобразуйте строку в формате json в тип MySQL JSON:

SELECT CAST('[1,2,3]' as JSON) ;
SELECT CAST('{"opening":"Sicilian","variations":["pelikan","dragon","najdorf"]}' as JSON);

Все функции MYSQL JSON

Name Description
JSON_APPEND() Append data to JSON document
JSON_ARRAY() Create JSON array
JSON_ARRAY_APPEND() Append data to JSON document
JSON_ARRAY_INSERT() Insert into JSON array-> Return value from JSON column after evaluating path; equivalent to JSON_EXTRACT().
JSON_CONTAINS() Whether JSON document contains specific object at path
JSON_CONTAINS_PATH() Whether JSON document contains any data at path
JSON_DEPTH() Maximum depth of JSON document
JSON_EXTRACT() Return data from JSON document->> Return value from JSON column after evaluating path and unquoting the result; equivalent to JSON_UNQUOTE(JSON_EXTRACT()).
JSON_INSERT() Insert data into JSON document
JSON_KEYS() Array of keys from JSON document
JSON_LENGTH() Number of elements in JSON document
JSON_MERGE() Merge JSON documents, preserving duplicate keys. Deprecated synonym for JSON_MERGE_PRESERVE()
JSON_MERGE_PRESERVE() Merge JSON documents, preserving duplicate keys
JSON_OBJECT() Create JSON object
JSON_QUOTE() Quote JSON document
JSON_REMOVE() Remove data from JSON document
JSON_REPLACE() Replace values in JSON document
JSON_SEARCH() Path to value within JSON document
JSON_SET() Insert data into JSON document
JSON_TYPE() Type of JSON value
JSON_UNQUOTE() Unquote JSON value
JSON_VALID() Whether JSON value is valid

Перепечатанный яблочный блогловец змей говорит