我在玩用户定义的类型,发现你可以这样做:
cqlsh:test> CREATE TYPE ping(time timestamp);
cqlsh:test> CREATE TYPE pong(time timestamp, ping frozen <ping>);
cqlsh:test> ALTER TYPE ping ADD pong frozen <pong>;
cqlsh:test> DESC TYPE ping ;
CREATE TYPE test.ping (
time timestamp,
pong frozen<pong>
);
cqlsh:test> DESC TYPE pong ;
CREATE TYPE test.pong (
time timestamp,
ping frozen<ping>
);这与任何用例都相关吗?
发布于 2015-09-15 09:30:47
这是在开发一个密切相关的Java驱动票证时遇到的。
模式似乎是递归的,但当您实际尝试插入数据时,这种方法不起作用:
// (using int instead of time for the sake of clarity)
cqlsh:test> create type ping(pingid int);
cqlsh:test> create type pong(pongid int, ping frozen<ping>);
cqlsh:test> alter type ping ADD pong frozen<pong>;
cqlsh:test> create table foo(ping frozen<ping> primary key);
// These are OK:
cqlsh:test> insert into foo(ping) values( {pingid:1} );
cqlsh:test> insert into foo(ping) values(
{ pingid:1,
pong: { pongid:2,
ping: {pingid: 3}}} );
// But notice what happens when you nest one more level:
cqlsh:test> insert into foo(ping) values(
{ pingid:1,
pong: { pongid:2,
ping: {pingid: 3,
pong: {pongid: 4}}}} );
InvalidRequest: code=2200 [Invalid query] message="Unknown field 'pong' in value of user
defined type ping"看起来,在定义ping时使用的pong是一个“副本”,它没有看到ALTER语句的效果。因此,我的猜测是,递归是不允许的,并有一个缺失的检查。当我得到卡桑德拉开发者的确认后,我会更新我的答案。
一个有趣的副作用是,在此之后既不能删除ping,也不能删除pong:)
编辑:--这确实是ALTER TYPE不应该允许的。见卡桑德拉-10339。
发布于 2015-03-14 05:52:19
好吧,我还没有看到/听说过这些用例中的任何一个,但是您可以使用这样的结构来存储树或链接列表(尽管Cassandra已经支持列表,所以我不知道会有什么好处)。
https://stackoverflow.com/questions/29037733
复制相似问题