2017-06-15 147 views
0

我想创建一个动态的列中的新列。修改动态列内容

我的表格模板只是有两列: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 

结构结果:

{"general": {"Inner":"value"}} 

我怎样才能得到一个列添加到动态“一般”栏而不是替换内容:

{"Inner":"value"} 

我这两个查询后想要的结果?

回答

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的名称。

所以,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') 
)