2017-06-15 136 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') 
)