如何在cassandra CQL 3命令行中自动生成uuid

时间:2013-07-30 11:05:38

标签: cassandra cql cql3

刚学习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 个答案:

答案 0 :(得分:83)

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

INSERT INTO users(uid, name) VALUES(uuid(), 'my name');

答案 1 :(得分:45)

您可以使用now()功能使用时间uuids(类型1 UUID),例如

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

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

虽然没有类型4 UUID的这样的功能。


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

答案 2 :(得分:19)

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

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

这会将timeuuid转换为blob,并将blob转换为uuid

答案 3 :(得分:11)

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

Cassandra 2.0.7及更高版本包含uuid()函数,该函数不带参数,并生成Type 4 UUID,以便在INSERTSET语句中使用。

您还可以使用timeuuid类型now()之类的功能。它们会生成Type 1 UUID。

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

如果您希望将timeuuid用作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