JSON型の特定要素のみの更新についてのメモ
■準備
jsonを持つテーブルを用意
CREATE TABLE `test` (
`col` JSON NULL DEFAULT NULL
);
INSERT INTO test (col) values (null);
■UPDATE分
test
テーブルのcol
カラムのkey1
という要素を更新
UPDATE test SET
col = JSON_SET(
IFNULL(col, '{"key1":null}'),
'$.key1',
CAST('[{"name":"なまえ1","text":"テキスト1"}]' AS JSON)
)
JSON_SET
はnull
の場合、値の設定が出来ません。
その為、IFNULL
を使用してnull
の場合にデフォルト値を使用するようにしています。
json
文字列を設定する場合、CAST
が必要になります。
json
文字列を直接記述していますが、JSON_OBJECT
を使用することも可能です。
※プログラムで文字列を生成することを考えています。
■PHPから更新
test
テーブルのcol
カラムのkey1
という要素を更新
// SQL文字列を作成
$sql = sprintf(
'UPDATE test SET col = JSON_SET(IFNULL(col, \'%s\'), \'$.key1\', CAST(\'%s\' AS JSON))',
json_encode(['key1' => null]),
json_encode(['name' => 'テスト'], JSON_UNESCAPED_UNICODE),
);
// SQLを実行
...
IFNULL
のデフォルト値は(複数)階層になりますので、json_encode
で配列を渡しています。
設定値のjson_encode
のJSON_UNESCAPED_UNICODE
は設定しないとエスケープされます。