首先,这里是你的查询会发生什么。
MariaDB [test]> CREATE TABLE Templates (ID INT, Structure BLOB);
Query OK, 0 rows affected (0.24 sec)
MariaDB [test]> INSERT INTO Templates VALUES (1, COLUMN_CREATE('general',''));
Query OK, 1 row affected (0.05 sec)
MariaDB [test]> SELECT COLUMN_JSON(Structure) FROM Templates;
+------------------------+
| COLUMN_JSON(Structure) |
+------------------------+
| {"general":""} |
+------------------------+
1 row in set (0.00 sec)
此时你Structure
一个动态列有姓名general
和空字符串作为值。
然后你这样做:
UPDATE `Templates`
SET `Structure` = COLUMN_ADD(
COLUMN_GET(`Structure`, 'general' as CHAR),
'Inner',
'value'
) ...
你COLUMN_GET
得到general
动态列,这是一个空字符串,并使用它作为COLUMN_ADD
第一个参数的值。这是一个无用的运动,因为如果你想在一个空字符串运行COLUMN_ADD
,你可以这么说在查询或使用COLUMN_CREATE
;如果你想实际添加一些斑点的存在价值,你需要使用Blob的名称。
所以,COLUMN_ADD
作品上一个空字符串 - 换句话说,创造了Structure
一个干净的新价值,丢弃所有来 - 与名Inner
和值value
增添了动态列。这就是为什么你收到此:
MariaDB [test]> SELECT COLUMN_JSON(Structure) FROM Templates;
+------------------------+
| COLUMN_JSON(Structure) |
+------------------------+
| {"Inner":"value"} |
+------------------------+
1 row in set (0.00 sec)
显然,你想要做的,而不是什么对general
列的值设置为一个新的动态列。
你并不需要取得用于该general
列,因为如果一列y
在BLOB x
已经存在COLUMN_ADD(x,y,z)
将替换值。但是您需要为新值general
构建一个新的动态列。
所以,你应该做的是
UPDATE `Templates`
SET `Structure` = COLUMN_ADD(
`Structure`,
'general',
COLUMN_CREATE('Inner','value')
) ...
这说明了一个更一般的情况下,当Structure
还包含其他列,不仅general
,并要保留它们。如果不是的话,你要确保团块包含只general
,那么你可以做
UPDATE `Templates`
SET `Structure` = COLUMN_CREATE(
'general',
COLUMN_CREATE('Inner','value')
)