51

刚学cassandra,有没有办法用CQL插入UUID,即

create table stuff (uid uuid primary key, name varchar);
insert into stuff (name) values('my name'); // fails
insert into stuff (uid, name) values(1, 'my name'); // fails

你能做类似的事情吗

insert into stuff (uid, name) values(nextuid(), 'my name');
4

4 回答 4

89

Cassandra 2.0.7开始,您可以只使用 uuid(),它会生成一个随机类型 4 UUID:

INSERT INTO users(uid, name) VALUES(uuid(), 'my name');
于 2014-08-14T22:05:42.387 回答
55

您可以使用now()函数使用时间 uuid(类型 1 UUID),例如

insert into stuff (uid, name) values(now(), 'my name');

适用于 uid 或 timeuuid。它生成一个“保证唯一”的 UID 值,该值还包含时间戳,因此可以按时间排序。

但是对于 4 类 UUID,没有这样的功能。


更新:本说明适用于旧版本的 Cassandra。对于较新的版本,请参见下文。

于 2013-07-30T11:10:48.717 回答
21

实际上有一种方法可以使用 blob 转换函数 -blobAsType()typeAsBlob(). 在您的情况下,这应该是:

insert into stuff (uid, name) values(blobAsUuid(timeuuidAsBlob(now())), 'my name');

这将转换timeuuidblob和从blob将其转换为uuid.

于 2014-04-02T10:14:19.270 回答
14

UUID 是用于避免冲突的通用唯一 ID。

Cassandra 2.0.7 及更高版本包含uuid()不带参数并生成类型 4 UUID 用于INSERTorSET语句的函数。

您还可以使用timeuuid具有类似功能的类型now()。它们生成 1 类 UUID。

Type 1 和 Type 4 UUID 的区别在于 Type 1 UUID 是使用时间戳生成的,Type 4 是使用随机数生成的。

如果您想使用 atimeuuid作为uuid使用类似的东西blobAsUuid(timeuuidAsBlob(now())),因为返回的值now()保证是唯一的。

参考:

http://docs.datastax.com/en/cql/3.3/cql/cql_reference/uuid_type_r.html

http://docs.datastax.com/en/cql/3.3/cql/cql_reference/timeuuid_functions_r.html

http://docs.datastax.com/en/cql/3.3/cql/cql_reference/blob_r.html

于 2015-08-13T05:02:22.707 回答