もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

MysqlのJSON型へのINSERTやUPDATEやDELETE

はじめに

こんばんは。

やっとリリースが出来て、落ち着いてきました。

今回も簡単ですが備忘録を書き書き。

MySQLJSON型とかを時々使ってるんですが、JSONに向けて UPDATE や INSERT DELETE を実行したので、ログを残しておきます。

本題

こんなテーブルを作りました。

mysql> desc example_table;
+---------+---------------------+------+-----+---------+----------------+
| Field   | Type                | Null | Key | Default | Extra          |
+---------+---------------------+------+-----+---------+----------------+
| id      | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| options | json                | NO   |     | NULL    |                |
+---------+---------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)


mysql > INSERT INTO example_table VALUES
(1, JSON_OBJECT('aaa', 100, 'bbb', 200, 'ccc', 300)),
(2, JSON_OBJECT('eee', 1000, 'fff', 2000, 'ggg', 3000)),
(3, JSON_OBJECT('xxx', 10000, 'yyy', 20000, 'zzz', 30000));


mysql> SELECT * FROM example_table;
+----+--------------------------------------------+
| id | options                                    |
+----+--------------------------------------------+
|  1 | {"aaa": 100, "bbb": 200, "ccc": 300}       |
|  2 | {"eee": 1000, "fff": 2000, "ggg": 3000}    |
|  3 | {"xxx": 10000, "yyy": 20000, "zzz": 30000} |
+----+--------------------------------------------+
3 rows in set (0.00 sec)

UPDATE

mysql> UPDATE example_table SET options = JSON_SET(options, "$.fff", 2222) WHERE id = 2;


mysql> SELECT * FROM example_table;
+----+--------------------------------------------+
| id | options                                    |
+----+--------------------------------------------+
|  1 | {"aaa": 100, "bbb": 200, "ccc": 300}       |
|  2 | {"eee": 1000, "fff": 2222, "ggg": 3000}    |
|  3 | {"xxx": 10000, "yyy": 20000, "zzz": 30000} |
+----+--------------------------------------------+
3 rows in set (0.00 sec)

対象のレコードの対象のjson keyがupdateされてます。

INSERT

mysql> UPDATE example_table SET options=JSON_MERGE(options, JSON_OBJECT('hhh', 4000)) WHERE id = 2;


mysql> SELECT * FROM example_table;
+----+------------------------------------------------------+
| id | options                                              |
+----+------------------------------------------------------+
|  1 | {"aaa": 100, "bbb": 200, "ccc": 300}                 |
|  2 | {"eee": 1000, "fff": 2222, "ggg": 3000, "hhh": 4000} |
|  3 | {"xxx": 10000, "yyy": 20000, "zzz": 30000}           |
+----+------------------------------------------------------+
3 rows in set (0.00 sec)

対象のレコードの対象のjson dataに 指定したkeyが指定したvalueで追加されています!

DELETE

mysql> UPDATE example_table SET options = JSON_REMOVE(options, '$.fff') WHERE id = 2;


mysql> SELECT * FROM example_table;
+----+--------------------------------------------+
| id | options                                    |
+----+--------------------------------------------+
|  1 | {"aaa": 100, "bbb": 200, "ccc": 300}       |
|  2 | {"eee": 1000, "ggg": 3000, "hhh": 4000}    |
|  3 | {"xxx": 10000, "yyy": 20000, "zzz": 30000} |
+----+--------------------------------------------+
3 rows in set (0.01 sec)

対象のレコードの対象のjson dataに 指定したkeyが削除されています。

こんな感じで簡単にいきました!

ちなみに JSON型ではなく String型でJSONの形で保存されているデータでも問題なく動きます。

終わりに

アドベントカレンダーの季節になったので、僕も何個かチャレンジしてみたいなと思ってます!

では現場からは以上です。