首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CQL:更改用户定义类型中的特定数据

CQL:更改用户定义类型中的特定数据
EN

Stack Overflow用户
提问于 2017-11-25 05:36:32
回答 1查看 378关注 0票数 0

我是CQL的新手;我一直在尝试UDT,并遇到了这个问题:

一旦我创建了一个用户定义的类型并向表中添加了一个新行,有没有办法在不重新定义所有字段的情况下更新其中的字段?例如,我有一个名为test的表,其中包含一个名称(文本、主键)和一个用户定义的类型,格式如下:

代码语言:javascript
运行
复制
create type favorites(
color text,
number int,
food text,
location set<text>
);

我将一个新值插入到表中,如下所示:

代码语言:javascript
运行
复制
insert into test(name, favorite_stuff) values(
'Spongebob',
{color:'yellow', number: 12, food:'krabby patty', location:{'bikini bottom', 'goo lagoon'}}
);

现在,我想把海绵宝宝最喜欢的颜色改成“粉红色”,并把“手套世界”添加到他最喜欢的地方列表中。我现在知道如何做到这一点的唯一方法是重新定义一切:

代码语言:javascript
运行
复制
update test 
set favorite_stuff = {
color:'pink',
number:12,
food:'krabby patty',
location:{'bikini bottom', 'goo lagoon', 'glove world'}
} where name='Spongebob';

有没有更好的方法来做这件事?

EN

回答 1

Stack Overflow用户

发布于 2017-11-26 13:47:05

我假设您的表模式是CREATE TABLE test(name text primary key, favorite_stuff frozen<favorites>);。favorite_stuff 必须是冻结的,因为在cassandra中不支持具有嵌套的非冻结集合的非冻结UDT。使用此模式,由于以下原因,您不能执行任何部分更新。

冻结值将多个组件序列化为单个值。非冻结类型允许对单个字段进行更新。Cassandra将冻结类型的值视为blob。必须覆盖整个值。

但是,您可以按如下所示更改您的收藏类型架构。然后,您将能够更新单个属性(但不能更新位置属性,因为位置现在已冻结)

代码语言:javascript
运行
复制
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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47480298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档