我是CQL的新手;我一直在尝试使用UDT,并遇到了这个问题:
一旦我创建了用户定义的类型并向表中添加了新行,是否有任何方法可以更新其中的字段而无需重新定义所有字段?例如,我有一个名为test的表,其中包含名称(文本,主键)和以下格式的用户定义类型:
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'}}
);
现在,我想将海绵宝宝最喜欢的颜色改为粉红色&#39;并添加手套世界&#39;到他最喜欢的地点列表。我现在知道如何做到这一点的唯一方法就是重新定义一切:
update test
set favorite_stuff = {
color:'pink',
number:12,
food:'krabby patty',
location:{'bikini bottom', 'goo lagoon', 'glove world'}
} where name='Spongebob';
有更好的方法吗?
答案 0 :(得分:1)
我假设您的表架构为CREATE TABLE test(name text primary key, favorite_stuff frozen<favorites>);
。 favorite_stuff 必须冻结,因为cassandra不支持具有嵌套非冻结集合的非冻结UDT。使用此架构,由于以下原因,您无法进行任何部分更新。
冻结值将多个组件序列化为单个值。非冻结类型允许更新单个字段。 Cassandra将冻结类型的值视为blob。必须覆盖整个值。
但是,您可以按照以下更改收藏夹类型架构。然后,您将能够更新单个属性(但不是位置属性,因为位置现在被冻结)
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>