Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 修改动态列内容_Sql_Mariadb - Fatal编程技术网

Sql 修改动态列内容

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

我正在尝试在动态列中创建一个新列

我的表模板只有两列:ID、Structure(blob)

我运行以下查询:

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
和value
value
的动态列。这就是为什么你会得到这个:

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)
将替换blob
x
中已经存在的
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')
)