53

Just learning cassandra, is there a way to insert a UUID using CQL, ie

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

Can you do something like

insert into stuff (uid, name) values(nextuid(), 'my name');
Jay
  • 19,649
  • 38
  • 121
  • 184

4 Answers4

92

As of Cassandra 2.0.7 you can just use uuid(), which generates a random type 4 UUID:

INSERT INTO users(uid, name) VALUES(uuid(), 'my name');
rogerdpack
  • 62,887
  • 36
  • 269
  • 388
lumi
  • 1,176
  • 1
  • 9
  • 6
55

You can with time uuids (type 1 UUID) using the now() function e.g.

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

Works with uid or timeuuid. It generates a "guaranteed unique" UID value, which also contains the timestamp so is sortable by time.

There isn't such a function for type 4 UUIDs though.


UPDATE: This note pertains to older versions of Cassandra. For newer versions, see below.

rogerdpack
  • 62,887
  • 36
  • 269
  • 388
Richard
  • 11,050
  • 2
  • 46
  • 33
  • 3
    Is there any disadvantage to using timeuuid vs uuid? – Jay Jul 30 '13 at 11:16
  • 6
    The main disadvantage is it leaks the MAC address of the creator and the time. But the advantages are its uniqueness is deterministic and you can sort events by time. – Richard Jul 30 '13 at 11:21
  • Thanks. I appreciate your detailed reply! – Jay Jul 30 '13 at 11:22
  • 2
    Actually, a TimeUUID *is* a UUID. Just like a Braeburn apple *is* an apple. Read the Cassandra doc and my longer answer: http://stackoverflow.com/questions/17945677/cassandra-uuid-vs-timeuuid-benefits-vs-disadvantages/17946236#17946236 – Basil Bourque Jul 30 '13 at 12:04
  • this is not the best answer, check out the one from Zhivko – Tommaso Barbugli Jun 16 '15 at 08:05
  • @Richard it seems to me that it is generated on the coordinator node so doesn't leak the local MAC address? Anyway this way is sortable by time, not sure why this way would be disdained... – rogerdpack May 09 '18 at 19:20
21

Actually there is a way to do that using the blob conversion functions - blobAsType() and typeAsBlob(). In your case this should be:

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

This converts timeuuid to blob and from the blob converts it to uuid.

Alexis Wilke
  • 19,179
  • 10
  • 84
  • 156
Zhivko Donev
  • 451
  • 3
  • 2
14

A UUID is a Universally Unique ID used to avoid collisions.

Cassandra 2.0.7 and later versions include the uuid() function that takes no parameters and generates a Type 4 UUID for use in INSERT or SET statements.

You can also use a timeuuid type with a function like now(). They generate a Type 1 UUID.

The difference between Type 1 and Type 4 UUIDs is that a Type 1 UUID is generated using a timestamp and a Type 4 is generated using random numbers.

If you want to use a timeuuid as a uuid use something like blobAsUuid(timeuuidAsBlob(now())), since the value returned by now() is guaranteed to be unique.

References:

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

Esteban Herrera
  • 2,263
  • 2
  • 23
  • 32