2017-06-15 12 views
0

動的列内に新しい列を作成しようとしています。動的列の内容を変更する

私のテーブルのテンプレートはちょうど2つの列があります。ID、構造(ブロブ)

私はこのクエリを実行します(表示のためにCOLUMN_JSONを使用)

UPDATE `Templates` SET `Structure` = COLUMN_ADD(`Structure`, 'general', '') where `Templates`.`ID` = 1 

構造の結果:

{"general":""} 

を次に、このクエリを実行します。

UPDATE `Templates` SET `Structure` = COLUMN_ADD(COLUMN_GET(`Structure`, 'general' as CHAR), 'Inner', 'value') WHERE `Templates`.`ID` = 1 

構造結果:

{"Inner":"value"} 

私は両方のクエリの後に欲しい結果:

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

がどのように私は列ではなく、コンテンツを置き換えるのダイナミックな「一般」の欄に追加し得ることができますか?

答えて

1

最初に、あなたのクエリではどうなりますか?あなたが名前generalと値として空の文字列とStructure 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) 

は、その後、あなたは次の操作を行います。

UPDATE `Templates` 
    SET `Structure` = COLUMN_ADD(
    COLUMN_GET(`Structure`, 'general' as CHAR), 
    'Inner', 
    'value' 
) ... 

あなたCOLUMN_GETが空の文字列で、COLUMN_ADDのための最初の引数として使用しますgeneral動的な列の値を取得します。空文字列にCOLUMN_ADDを実行する場合は、クエリ内でこれを言うか、COLUMN_CREATEを使用することができます。実際ににしたい場合は、BLOBの既存の値に何かを追加して、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列の値を設定することです:それはあなたがこれを得ている理由です。

あなたは、列yが既にブロブxに存在する場合COLUMN_ADD(x,y,z)が値に置き換えられますので、そのためのgeneral列をフェッチする必要はありません。しかし、新しい値generalの新しい動的列を作成する必要があります。

Structureもないだけで、他の列が含まれgeneral、そしてあなたがそれらを保持したいときに、何を行うべきこと

UPDATE `Templates` 
SET `Structure` = COLUMN_ADD(
    `Structure`, 
    'general', 
    COLUMN_CREATE('Inner','value') 
) ... 

これは、より一般的なケースを占めています。それはそうではないのです、とあなたはブロブはが含まれていることを確認したい場合のみgeneral、あなたが行うことができます

UPDATE `Templates` 
SET `Structure` = COLUMN_CREATE(
    'general', 
    COLUMN_CREATE('Inner','value') 
) 
関連する問題