修改动态列内容

时间:2017-06-15 15:32:19

标签: sql mariadb

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

我的表格模板只有两列: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"列而不是替换内容?

1 个答案:

答案 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
相关问题