Cassandra 卡桑德拉中的冻结关键字

Cassandra 卡桑德拉中的冻结关键字,cassandra,Cassandra,无论我在UDT中使用或不使用冻结关键字,它都是在更新记录 我有一个表用户: CREATE TABLE demokeyspace.user ( userid text PRIMARY KEY, address1 frozen<address>, password text, uname text ) 它正在更新街道:'updated street'和城市以及邮政编码为null 按照Cassandra的说法,如果UDT值被声明为冻结,则不允许更新UD

无论我在UDT中使用或不使用冻结关键字,它都是在更新记录

我有一个表用户:

CREATE TABLE demokeyspace.user (
    userid text PRIMARY KEY,
    address1 frozen<address>,
    password text,
    uname text
)

它正在更新街道:'updated street'和城市以及邮政编码为null

按照Cassandra的说法,如果UDT值被声明为冻结,则不允许更新UDT值


有人能帮我吗?

如果您使用非冻结UDT,并且希望更新一个字段,那么您可以使用以下()命令:

在您的情况下,您正在使用UDT更新完整的
address1
字段,其中只有一个值

在使用冻结UDT的情况下,必须在更新期间指定所有值,就像您现在所做的那样,但提供所有值


如果您总是更新完整记录,则鼓励使用冻结值,但如果您需要更新部分记录,则不应使用冻结值。

我使用的是[cqlsh 5.0.1 | Cassandra 3.11.2 | CQL spec 3.4.4 | Native protocol v4],谢谢Alex,如果我有一个类似UDT的列表和顺序有20列,请回答一个问题。此UDT的最大大小及其可行性是什么?如果我理解正确,
订单
是UDT-在这种情况下,它应该被冻结。“冻结”值只是一组字节,所以总体大小将是此UDT中所有字段的大小+表示类型的一些开销。关于
列表
-如果可能(值的顺序不重要,等等),那么最好使用
设置
-它在磁盘上有更好的表示。好吧,假设我每天有1000个订单,是否适合在Cassandra中将其定义为UDT?对不起,也许我不完全理解。。。UDT用于表示复杂的数据结构。Order通常有它,所以可以将它表示为UDT。在列表中存储订单-这是另一个问题。也许将每个订单表示为单独的行更有效,但这实际上取决于您的访问模式……冻结和列表都是相同的吗?当我将列创建为addressdetail冻结时,它将显示为addressdetail冻结。当我描述桌子时;
CREATE TYPE demokeyspace.address (
    street text,
    city text,
    zip_code int
);
update user set address1.street='updated street' where userid='2';