刚学习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');
答案 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,以便在INSERT
或SET
语句中使用。
您还可以使用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