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

Jac*_*cob 46 cql cassandra 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
Run Code Online (Sandbox Code Playgroud)

你能做点什么吗?

insert into stuff (uid, name) values(nextuid(), 'my name');
Run Code Online (Sandbox Code Playgroud)

lum*_*umi 86

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

INSERT INTO users(uid, name) VALUES(uuid(), 'my name');
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你让我的一天! (2认同)

Ric*_*ard 48

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

insert into stuff (uid, name) values(now(), 'my name');
Run Code Online (Sandbox Code Playgroud)

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

但是,类型4 UUID没有这样的功能.


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

  • 它的主要缺点是泄漏了创建者的MAC地址和时间.但优点是它的独特性是确定性的,你可以按时间对事件进行排序. (6认同)
  • 使用timeuuid vs uuid有什么不利吗? (3认同)
  • 实际上,TimeUUID*是一个UUID.就像Braeburn苹果*是一个苹果.阅读Cassandra doc和我的更长答案:http://stackoverflow.com/questions/17945677/cassandra-uuid-vs-timeuuid-benefits-vs-disadvantages/17946236#17946236 (2认同)

小智 20

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

insert into stuff (uid, name) values(blobAsUuid(timeuuidAsBlob(now())), 'my name');
Run Code Online (Sandbox Code Playgroud)

这将转换timeuuid为转换为blobblob转换为uuid.

  • 这实际上回答了这个问题.尼斯. (2认同)
  • 也相信这是正确的答案.问题是我们不需要将类型从uuid更改为timeuuid (2认同)

Est*_*era 13

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

Cassandra 2.0.7及更高版本包含uuid()不带参数的函数,并生成用于INSERTSET语句的Type 4 UUID .

您也可以使用timeuuid具有类似函数的类型now().它们生成Type 1 UUID.

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

如果你想使用timeuuiduuid应用类似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