首页 > 解决方案 > 如何更新 cassandra 冻结的 UDT 列中的字段?

问题描述

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

标签: cassandradata-modeling

解决方案


您是正确的,您无法更新冻结的 UDT 列的单个字段,但您可以更新整个列的值。您不需要删除以前的记录。直接更新字段就好了。让我用我在Astra上创建的一个例子来说明。

这是一个存储用户地址的用户定义类型:

CREATE TYPE address (
  number int,
  street text,
  city text,
  zip int
)

这是用户表的定义:

CREATE TABLE users (
  name text PRIMARY KEY,
  address frozen<address>
)

在此表中,有一个用户的地址存储为:

cqlsh> SELECT * FROM users ;

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

假设街道号码不正确。如果我们尝试只更新街道号码字段:

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}

这是因为整个值(不仅仅是街道号码字段)都被更新覆盖了。更新街道号码的正确方法是为地址的所有字段显式设置一个值:

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}

干杯!


推荐阅读