我正在尝试在动态列中创建一个新列。
我的表格模板只有两列:ID,结构(blob)
我运行此查询:
UPDATE `Templates` SET `Structure` = COLUMN_ADD(`Structure`, 'general', '') where `Templates`.`ID` = 1
结构结果(使用COLUMN_JSON显示):
{"general":""}
然后我运行这个查询:
UPDATE `Templates` SET `Structure` = COLUMN_ADD(COLUMN_GET(`Structure`, 'general' as CHAR), 'Inner', 'value') WHERE `Templates`.`ID` = 1
结构结果:
{"Inner":"value"}
两次查询后我想要的结果:
{"general": {"Inner":"value"}}
如何将一个列添加到动态" general"列而不是替换内容?
答案 0 :(得分:1)
首先,您的查询会发生这种情况。
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的现有值,你需要使用blob的名称。
因此,COLUMN_ADD
适用于空字符串 - 换句话说,为Structure
创建一个干净的新值,放弃它拥有的所有内容 - 并添加名为{{1}的动态列}和值Inner
。这就是你得到这个的原因:
value
显然,您要做的是将MariaDB [test]> SELECT COLUMN_JSON(Structure) FROM Templates;
+------------------------+
| COLUMN_JSON(Structure) |
+------------------------+
| {"Inner":"value"} |
+------------------------+
1 row in set (0.00 sec)
列的值设置为新的动态列。
您不需要为此获取general
列,因为general
会在blob COLUMN_ADD(x,y,z)
中已存在列y
时替换该值。但是您需要为x
的新值构建一个新的动态列。
那么,你应该做的是
general
这解释了UPDATE `Templates`
SET `Structure` = COLUMN_ADD(
`Structure`,
'general',
COLUMN_CREATE('Inner','value')
) ...
还包含其他列的更一般情况,而不仅仅是Structure
,并且您希望保留它们。如果情况并非如此,并且您想确保blob仅包含 general
,那么您可以
general