我是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'}}
);现在,我想把海绵宝宝最喜欢的颜色改成“粉红色”,并把“手套世界”添加到他最喜欢的地方列表中。我现在知道如何做到这一点的唯一方法是重新定义一切:
update test
set favorite_stuff = {
color:'pink',
number:12,
food:'krabby patty',
location:{'bikini bottom', 'goo lagoon', 'glove world'}
} where name='Spongebob';有没有更好的方法来做这件事?
发布于 2017-11-26 13:47:05
我假设您的表模式是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>https://stackoverflow.com/questions/47480298
复制相似问题