2017-08-14 12 views
0

オブジェクト - foo_table私が列を持っている - foo_idsをし、次のようにその内容は次のとおりです。
[{"id": "432"}, {"id": "433"}]JSONの配列にJSONオブジェクトを追加し、MySQLはこの表では

私の質問これに新しいJSONオブジェクトを追加する方法がありますカラム?私はこの新しいオブジェクトを使用している場合ので、例えば - 何も存在しない場合
[{"id": "432"}, {"id": "433"}, {"id": "554"}]
任意のアイデアはどのように挿入することができますし、すでに存在する場合は、新しいJSONオブジェクトを追加 - {"id": "554"}は、私は私のfoo_ids列の値がなりたいですか?次のように

答えて

2

あなたはJSON_ARRAY_APPEND機能を使用することができます。

mysql> SELECT VERSION(); 
+-----------+ 
| VERSION() | 
+-----------+ 
| 5.7.19 | 
+-----------+ 
1 row in set (0.00 sec) 

mysql> DROP TABLE IF EXISTS `foo_table`; 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE IF NOT EXISTS `foo_table` (
    -> `id` SERIAL, 
    -> `foo_ids` JSON 
    ->); 
Query OK, 0 rows affected (0.01 sec) 

mysql> INSERT INTO `foo_table` (`foo_ids`) 
    -> VALUES (NULL); 
Query OK, 1 row affected (0.00 sec) 

mysql> SELECT `id`, `foo_ids` 
    -> FROM `foo_table`; 
+----+---------+ 
| id | foo_ids | 
+----+---------+ 
| 1 | NULL | 
+----+---------+ 
1 row in set (0.00 sec) 

mysql> UPDATE `foo_table` 
    -> SET `foo_ids` = IF(
    ->      `foo_ids` IS NULL OR 
    ->      JSON_TYPE(`foo_ids`) != 'ARRAY', 
    ->      JSON_ARRAY(), 
    ->      `foo_ids` 
    ->     ), 
    ->  `foo_ids` = JSON_ARRAY_APPEND(
    ->     `foo_ids`, 
    ->     '$', 
    ->     CAST('{"id": "432"}' AS JSON), 
    ->     '$', 
    ->     CAST('{"id": "433"}' AS JSON) 
    ->    ) 
    -> WHERE `id` = 1; 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 

mysql> SELECT `id`, `foo_ids` 
    -> FROM `foo_table`; 
+----+--------------------------------+ 
| id | foo_ids      | 
+----+--------------------------------+ 
| 1 | [{"id": "432"}, {"id": "433"}] | 
+----+--------------------------------+ 
1 row in set (0.00 sec) 

mysql> UPDATE `foo_table` 
    -> SET `foo_ids` = IF(
    ->      `foo_ids` IS NULL OR 
    ->      JSON_TYPE(`foo_ids`) != 'ARRAY', 
    ->      JSON_ARRAY(), 
    ->      `foo_ids` 
    ->     ), 
    ->  `foo_ids` = JSON_ARRAY_APPEND(
    ->     `foo_ids`, 
    ->     '$', 
    ->     CAST('{"id": "554"}' AS JSON) 
    ->    ) 
    -> WHERE `id` = 1; 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 

mysql> SELECT `id`, `foo_ids` 
    -> FROM `foo_table`; 
+----+-----------------------------------------------+ 
| id | foo_ids          | 
+----+-----------------------------------------------+ 
| 1 | [{"id": "432"}, {"id": "433"}, {"id": "554"}] | 
+----+-----------------------------------------------+ 
1 row in set (0.00 sec) 

db-fiddleを参照してください。

UPDATE

は、条件付きで<=>演算子を使用することができます。

mysql> UPDATE `foo_table` 
    -> SET `foo_ids` = IF(
    ->      JSON_TYPE(`foo_ids`) <=> 'ARRAY', 
    ->      `foo_ids`, 
    ->      JSON_ARRAY() 
    ->     ), 
    ->  `foo_ids` = JSON_ARRAY_APPEND(
    ->     `foo_ids`, 
    ->     '$', 
    ->     CAST('{"id": "554"}' AS JSON) 
    ->    ) 
    -> WHERE `id` = 1; 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 

db-fiddleを参照してください。

関連する問題