В базе данных MySQL хранятся некоторые данные JSON с табличной схемой:
create TABLE ApplicationEntity (
-> name varchar(100),
-> jsonData longtext
-> ) ENGINE=InnoDB Default CHARSET=latin1;
Одна запись примера для jsonData в таблице выглядит так:
[{"name":"some_name","description":"good_description","gla":"None","srcPort":"123","dstPort":"2345","disableTimeout":false"}]
Как мы можем получить доступ к отдельному ключу и значению пары к обновлению.
Я пробовал что-то вроде этого:
mysql> Update ApplicationEntity set jsonData='%"gla":"google"%' where jsonData like '%"gla":"None"%';
Query OK, 5 rows affected (0.02 sec)
Rows matched: 5 Changed: 5 Warnings: 0
Но таблица попала в эту форму
mysql> select * from ApplicationEntity;
+------+-------------------------------------------------------------------------------------------------------------------+
| name | jsonData |
+------+-------------------------------------------------------------------------------------------------------------------+
| a1 | %"gla":"google"% |
| a2 | %"gla":"google"% |
| a2 | %"gla":"google"% |
| a2 | %"gla":"google"% |
| a2 | %"alg":"google"% |
| a2 | [{"name":"CREATED_IN_CHROME","description":"","gla":"google","srcPort":"","dstPort":"2345","disableTimeout":false}] |
| a2 | [{"name":"CREATED_IN_MOZILL","description":"","gla":"google","srcPort":"","dstPort":"2345","disableTimeout":false}] |
+------+-------------------------------------------------------------------------------------------------------------------+
Очевидно, что это не сработало, мой вопрос заключается в том, чтобы использовать тип данных longtext, как мы можем делать обновления для отдельных полей.
Итак, таблица должна войти в эту форму:
+------+-----------------------------------------------------------------------------------------------------------------------+
| name | jsonData |
+------+-----------------------------------------------------------------------------------------------------------------------+
| a1 | [{"name":"CREATED_IN_IE","description":"","gla":"google","srcPort":"","dstPort":"2345","disableTimeout":false}] |
| a2 | [{"name":"CREATED_IN_SAFARI","description":"","gla":"google","srcPort":"","dstPort":"2345","disableTimeout":false}] |
| a2 | [{"name":"CREATED_IN_OMERTA","description":"","gla":"google","srcPort":"","dstPort":"2345","disableTimeout":false}] |
| a2 | [{"name":"CREATED_IN_duckduckgo","description":"","gla":"google","srcPort":"","dstPort":"2345","disableTimeout":false}] |
| a2 | [{"name":"CREATED_IN_ucbrowser","description":"","gla":"google","srcPort":"","dstPort":"2345","disableTimeout":false}] |
| a2 | [{"name":"CREATED_IN_CHROME","description":"","gla":"google","srcPort":"","dstPort":"2345","disableTimeout":false}] |
| a2 | [{"name":"CREATED_IN_MOZILL","description":"","gla":"google","srcPort":"","dstPort":"2345","disableTimeout":false}] |
+------+-----------------------------------------------------------------------------------------------------------------------+
Что-то вроде этого также будет работать:
UPDATE ApplicationEntity
SET jsonData = REPLACE(jsondata, 'None', 'google')
WHERE jsonData LIKE '%"gla":"None"%'
Где REPLACE - это строковая функция MySQL
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_replace
Также мы должны знать, что регулярные выражения не поддерживаются функцией MySQL REPLACE.