cassandra - 如何更新 cassandra 冻结的 UDT 列中的字段?
问题描述
我知道冻结 UDT 列中的字段是不可能的,并且整个记录需要更新,在这种情况下,这是否意味着无法更新冻结的 UDT 列,并且如果存在冻结 UDT 列的字段更新的情况,那么案例一必须插入新记录并删除旧记录?
解决方案
您是正确的,您无法更新冻结的 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}
干杯!
推荐阅读
- python - 如何在不使用循环的情况下将 IPv4 地址从字节转换为字符串?
- java - 如何将我自己的证书(.pem 文件)添加到我的 selenium chromedriver?
- symfony - Gedmo Loggable 没有登录他的表“ext_log_entries”
- java - 使用 Gremlin GraphFactory 连接到 AWS Neptune
- r - R:数据直方图上的叠加泊松分布
- javascript - 如何以角度启用父组件的输入和按钮?
- java - 在 PhoneGap 中签署 Android 应用程序 - 我在哪里可以找到 keytool 文件?
- html - 是否可以在 SVG 中创建发光效果
- bash - makefile 中的 if-equals 语句作为单行
- java - 显示在 JSP 中呈现的 Spring Boot buildInfo() 版本