更新主键值Cassandra

时间:2017-01-30 02:41:35

标签: cassandra primary-key cql

我有node_id,node_name和data的表。我的要求是getByID和getByName。所以我把id和name作为主键。但我有时也需要更新名称。

我知道Cassandra不允许更新主键并在WHERE子句中使用非主键。

我怎样才能做到这一点?

我确实考虑先删除记录,然后再次使用相同的ID和新名称插入。但我读到这会产生墓碑并影响性能。

2 个答案:

答案 0 :(得分:0)

仅使用node_id作为主键。要实现getByName,请创建一个物化视图。 materialized views in cassandra

答案 1 :(得分:-1)

    create table users_by_id_name(
        id int,
        createdOn bigint, -- timestamp in millisec
        name text,
        age int, 
        primary key (id,name,createdOn)
    )WITH CLUSTERING ORDER BY ( name DESC, createdOn DESC);

使用上面的表定义来插入用户。 插入查询 -

insert into users_by_id_name (id,createdOn,name,age) values (1,100,'darthvedar',28);

更新用户,再次使用相同的用户ID和更新的名称以及createdOn值插入行。

insert into users_by_id_name (id,createdOn,name,age) values (1,200,'obi-wan-kenobi',28);

选择用户使用以下查询 -

按用户ID选择 -

select * from users_by_id_name where id=1 limit 1;

按名称选择用户 -

select * from users_by_id_name where name='obi-wan-kenobi' ALLOW FILTERING;

其他方式是在用户名上使用二级索引。想想,用户名不会太频繁地改变,所以二级索引也是一个不错的选择。

评论后编辑 -

如果您经常更新用户名,最好使用两个不同的表。

   create table users_by_id(
    id int,
    name text,
    age int, 
    primary key (id)
);
   create table users_by_name(
    id int,
    name text,
    age int, 
    primary key (name)
);

插入时,使用批处理语句在两个表中插入。

希望这会有所帮助。