如何更新cassandra冻结UDT列中的字段?

如何更新cassandra冻结UDT列中的字段?,cassandra,data-modeling,Cassandra,Data Modeling,我知道冻结的UDT列中的字段不可能,整个记录需要更新,在这种情况下,这是否意味着冻结的UDT列不可能更新,如果存在冻结的UDT列的字段更新场景,在这种情况下,必须插入新记录并删除旧记录?您可以更新冻结的UDT列,但需要为该UDT内的字段插入所有值。因此,您只能对该列进行常规更新 UPDATE table SET udt_col = new_value WHERE pk = .... 不需要先删除某些内容,等等 基本上,冻结值只是通过序列化UDT或集合获得的blob,并存储为行内的一个单元格,具

我知道冻结的UDT列中的字段不可能,整个记录需要更新,在这种情况下,这是否意味着冻结的UDT列不可能更新,如果存在冻结的UDT列的字段更新场景,在这种情况下,必须插入新记录并删除旧记录?

您可以更新冻结的UDT列,但需要为该UDT内的字段插入所有值。因此,您只能对该列进行常规更新

UPDATE table SET udt_col = new_value WHERE pk = ....
不需要先删除某些内容,等等


基本上,冻结值只是通过序列化UDT或集合获得的blob,并存储为行内的一个单元格,具有单个时间戳。这与非冻结值不同,在非冻结值中,UDT/集合的不同部分可以存储在不同的位置,并且具有不同的时间戳。

您可以正确地说,您不能更新冻结UDT列的各个字段,但可以更新整个列的值。您不需要删除上一条记录。可以直接更新字段。让我用我在上面创建的一个示例来说明

以下是存储用户地址的用户定义类型:

CREATE TYPE address (
  number int,
  street text,
  city text,
  zip int
)
以下是用户表的定义:

CREATE TABLE users (
  name text PRIMARY KEY,
  address frozen<address>
)
假设街道号码不正确。如果我们尝试仅使用以下内容更新街道编号字段:

cqlsh> UPDATE users SET address = {number: 456} WHERE name = 'alice';
我们将得到一个地址,只有街道号码,没有其他内容:

cqlsh> SELECT * FROM users ;

 name  | address
-------+----------------------------------------------------
 alice | {number: 456, street: null, city: null, zip: null}
这是因为更新覆盖了整个值(不仅仅是street number字段)。更新街道编号的正确方法是为地址的所有字段显式设置一个值:

cqlsh> UPDATE users SET address = {number: 456, street: 'Main Rd', city: 'Melbourne', zip: 3000} WHERE name = 'alice';
因此,我们最终得出以下结论:

cqlsh> SELECT * FROM users ;

 name  | address
-------+----------------------------------------------------------------
 alice | {number: 456, street: 'Main Rd', city: 'Melbourne', zip: 3000}

干杯

如果UDT中的一个字段上只有更新,而其他字段将是相同的,该怎么办。在这种情况下,更新是否有效?您不能更新冻结UDT中的一个字段。如果忽略其余部分,则通过设置为
null
…,它们将被覆盖。。。所以,若您想更新一个字段,您需要读取当前版本,更新其中的字段,并将更新后的值放回原处
cqlsh> SELECT * FROM users ;

 name  | address
-------+----------------------------------------------------------------
 alice | {number: 456, street: 'Main Rd', city: 'Melbourne', zip: 3000}