2017-11-24 14 views
0

CQLを初めて使用しました。私はUDTを試していて、この問題に遭遇しました。CQL:ユーザー定義型内の特定のデータを変更する

ユーザー定義型を作成してテーブルに新しい行を追加すると、すべてのフィールドを再定義する必要なくフィールドを更新する方法はありますかそれら?次のように

create type favorites(
color text, 
number int, 
food text, 
location set<text> 
); 

私はテーブルに新しい値を挿入する:例えば、私の名前(テキスト、主キー)、次の形式のユーザ定義型からなるテストと呼ばれるテーブルを有する

insert into test(name, favorite_stuff) values(
'Spongebob', 
{color:'yellow', number: 12, food:'krabby patty', location:{'bikini bottom', 'goo lagoon'}} 
); 

スポンジボブの好きな色を「ピンク」に変更し、好きな場所のリストに「グローブワールド」を追加したいと思います。私が今これを行う方法を知っている唯一の方法は、文字通りすべてを再定義することです。

update test 
set favorite_stuff = { 
color:'pink', 
number:12, 
food:'krabby patty', 
location:{'bikini bottom', 'goo lagoon', 'glove world'} 
} where name='Spongebob'; 

これを行うより良い方法はありますか?

答えて

1

テーブルスキーマをCREATE TABLE test(name text primary key, favorite_stuff frozen<favorites>);と仮定します。 favorite_stuff はフリーズする必要がありますネストされた非フリーズコレクションの非フリーズUDTは、cassandraではサポートされていません。このスキーマでは、以下の理由により部分的な更新はできません。

フリーズされた値は、複数のコンポーネントを単一の値にシリアル化します。非フリーズタイプでは、個々のフィールドを更新できます。 Cassandraは、フリーズされた型の値をブロブとして扱います。値全体を上書きする必要があります。

ただし、お気に入りのスキーマを以下のように変更することができます。次に、個々の属性を更新することができます(場所は固定されているため、位置属性は現在固定されていません)。

create type favorites(
    color text, 
    number int, 
    food text, 
    location frozen<set<text>> 
); 


cqlsh:test> update test set favorite_stuff.color='pink' where name='Spongebob'; 
cqlsh:test> select * from test; 

name  | favorite_stuff 
-----------+---------------------------------------------------------------------------------------------- 
Spongebob | {color: 'pink', number: 12, food: 'krabby patty', location: {'bikini bottom', 'goo lagoon'}} 

(1 rows) 
cqlsh:test> 
関連する問題