首先,這裏是你的查詢會發生什麼。
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')
)