问题描述
我在 cassandra 中创建了以下用户定义类型 (UDT):
CREATE TYPE keyspace.location (
latitude text,longitude text,accuracy text,address text
);
CREATE TYPE keyspace.person (
name text,contact_no text,alternate_contact text
);
我想用这些来创建另一个 UDT
CREATE TYPE keyspace.pinpoint(
user <person>,location <location>
);
解决方法
您需要将这些嵌套的 UDT 声明为 frozen<UDTName>
,例如:
CREATE TYPE keyspace.pinpoint(
user frozen<person>,location frozen<location>
);
但这意味着您将无法更新他们的各个字段 - 您只能更新整个字段,以及完整的 UDT 实例,例如,完整的 user
或 location
。
您可以通过以这种方式将您的 UDT 指定为另一个 UDT 中的类型来嵌套 UDT:
CREATE TYPE keyspace.pinpoint (
user person,location location
);
不要将它们括在 <>
方括号中,因为它们用于集合。
作为旁注,除非您别无选择,否则我个人不会嵌套 UDT。 UDT 不如原生列灵活。在嵌套的 UDT 中插入或更新数据会变得非常复杂且难以维护。
只要有可能,尽量使用通用的表定义。例如,不要定义类型 pinpoint
,而是尝试使用具有本机列类型和聚集行的表。干杯!