Sql 修改动态列内容
我正在尝试在动态列中创建一个新列 我的表模板只有两列:ID、Structure(blob) 我运行以下查询:Sql 修改动态列内容,sql,mariadb,Sql,Mariadb,我正在尝试在动态列中创建一个新列 我的表模板只有两列:ID、Structure(blob) 我运行以下查询: UPDATE `Templates` SET `Structure` = COLUMN_ADD(`Structure`, 'general', '') where `Templates`.`ID` = 1 结构结果(使用列_JSON显示): 然后我运行以下查询: UPDATE `Templates` SET `Structure` = COLUMN_ADD(COLUMN_GET(`St
UPDATE `Templates` SET `Structure` = COLUMN_ADD(`Structure`, 'general', '') where `Templates`.`ID` = 1
结构结果(使用列_JSON显示):
然后我运行以下查询:
UPDATE `Templates` SET `Structure` = COLUMN_ADD(COLUMN_GET(`Structure`, 'general' as CHAR), 'Inner', 'value') WHERE `Templates`.`ID` = 1
结构结果:
{"Inner":"value"}
两次查询后我想要的结果:
{"general": {"Inner":"value"}}
如何将列添加到动态“常规”列中,而不是替换内容?首先,下面是查询的结果
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\u GET
获取general
动态列的值,该值为空字符串,并将其用作COLUMN\u ADD
的第一个参数。这是一个无用的练习,因为如果您想在空字符串上运行COLUMN\u ADD
,您可以在查询中这样说,或者使用COLUMN\u CREATE
;如果您想在blob的现有值中添加一些内容,则需要使用blob的名称
因此,COLUMN\u ADD
处理空字符串——换句话说,为Structure
创建一个干净的新值,丢弃它所拥有的一切——并添加一个名为internal
和valuevalue
的动态列。这就是为什么你会得到这个:
MariaDB [test]> SELECT COLUMN_JSON(Structure) FROM Templates;
+------------------------+
| COLUMN_JSON(Structure) |
+------------------------+
| {"Inner":"value"} |
+------------------------+
1 row in set (0.00 sec)
显然,您要做的是将general
列的值设置为一个新的动态列
您不需要为此获取general
列,因为column\u ADD(x,y,z)
将替换blobx
中已经存在的y
列的值。但是您需要为general
的新值构造一个新的动态列
所以,你应该做的是
UPDATE `Templates`
SET `Structure` = COLUMN_ADD(
`Structure`,
'general',
COLUMN_CREATE('Inner','value')
) ...
当Structure
还包含其他列(不仅general
)并且您希望保留这些列时,这说明了一种更一般的情况。如果情况并非如此,并且您希望确保blob仅包含常规
,则可以执行以下操作
UPDATE `Templates`
SET `Structure` = COLUMN_CREATE(
'general',
COLUMN_CREATE('Inner','value')
)
UPDATE `Templates`
SET `Structure` = COLUMN_CREATE(
'general',
COLUMN_CREATE('Inner','value')
)