Sql Cassandra:使用不同的值更新多行

Sql Cassandra:使用不同的值更新多行,sql,cassandra,cql,nosql,Sql,Cassandra,Cql,Nosql,嗨,我在卡桑德拉有类似的表格: CREATE TABLE TestTable( id text, group text, date text, user text, dept text, orderby int, files list<text>, users list<text>, family_memebrs list<frozen

嗨,我在卡桑德拉有类似的表格:

CREATE TABLE TestTable( id text, 
        group text,
        date text,
        user text,
        dept text,
        orderby int,
        files list<text>,
        users list<text>, 
        family_memebrs list<frozen <member>>,
        PRIMARY KEY ((id)));'
CREATE INDEX on TestTable (user);
CREATE INDEX on TestTable (dept);
CREATE INDEX on TestTable (group);
CREATE INDEX on TestTable (date);
我想以相同的顺序更改以下ID 105102103的现有订单。i、 (105,1)(102,2)(103,3)。我是卡桑德拉的新手,请帮帮我。我认为在sql中使用rownum和join是可能的

我是卡桑德拉的新手

我看得出来。第一条线索是你的结果顺序。使用
id
作为您唯一的主键(使其成为您的分区键),您的结果将永远不会像那样排序。这是它们的分类方式:

aploetz@cqlsh:stackoverflow> SELECT id,orderby,token(id) FROM testtable  ;

 id  | orderby | system.token(id)
-----+---------+---------------------
 102 |       2 | -963541259029995480
 105 |       3 | 2376737131193407616
 101 |       1 | 4965004472028601333

(3 rows)
未绑定查询总是返回按分区键的哈希标记值排序的结果。我已经在分区键(
id
)上运行了
token()
函数来显示这一点

我想以相同的顺序更改以下ID 105102103的现有订单。i、 (105,1)(102,2)(103,3)

如果您只需更改
orderby
列中的值,那么这很简单:

aploetz@cqlsh:stackoverflow> INSERT INTO testtable(id,orderby) VALUES ('101',3);
aploetz@cqlsh:stackoverflow> INSERT INTO testtable(id,orderby) VALUES ('102',2);
aploetz@cqlsh:stackoverflow> INSERT INTO testtable(id,orderby) VALUES ('105',1);
aploetz@cqlsh:stackoverflow> SELECT id,orderby,token(id) FROM testtable  ;

 id  | orderby | system.token(id)
-----+---------+---------------------
 102 |       2 | -963541259029995480
 105 |       1 | 2376737131193407616
 101 |       3 | 4965004472028601333

(3 rows)
由于Cassandra主键是唯一的,只需为该键插入一个新的非键列值即可更改
orderby

现在,如果您希望能够按照
orderby
列对结果进行排序,那完全是另一个问题,并且无法用当前模型解决

如果这是您真正想要做的,那么您将需要一个具有不同主键定义的新表。因此,我将通过两个更改创建同一个表:我将它命名为
testtable\u by\u group
,并且我将使用一个组合主键
主键(group,orderby,id))
。现在我可以查询特定的组“group1”,并查看排序结果

aploetz@cqlsh:stackoverflow> CREATE TABLE testtable_by_group (group text,id text,orderby int,PRIMARY KEY (group,orderby,id));
aploetz@cqlsh:stackoverflow> INSERT INTO testtable_by_group(group,id,orderby) VALUES ('group1','101',3);
aploetz@cqlsh:stackoverflow> INSERT INTO testtable_by_group(group,id,orderby) VALUES ('group1','102',2);
aploetz@cqlsh:stackoverflow> INSERT INTO testtable_by_group(group,id,orderby) VALUES ('group1','105',1);
aploetz@cqlsh:stackoverflow> SELECT group,id,orderby,token(group) FROM testtable_by_group WHERE group='group1';

 group  | id  | orderby | system.token(group)
--------+-----+---------+----------------------
 group1 | 105 |       1 | -2413872665919611707
 group1 | 102 |       2 | -2413872665919611707
 group1 | 101 |       3 | -2413872665919611707

(3 rows)
这样,
group
就是新的分区键
orderby
是第一个聚类键,因此
组中的行将根据它自动排序<如果任意两行具有相同的
orderby
,则code>id
位于末尾以确保唯一性

请注意,我在结果集中保留了
token()
函数,但在新的分区键(
group
)上运行了它。如您所见,
group1
的键被散列为所有3行的相同标记,这意味着在多节点环境中,所有3行将存储在一起。这会在集群中创建一个“热点”,其中一些节点的数据比其他节点多。这就是为什么一个好的主键定义可以确保查询满足和数据分布


不久前,我就这个话题为DataStax写了一篇文章。阅读一下,它应该会帮你解决问题:

你能编辑你的问题,把你的
创建表
语句包括进去吗?如果它们都共享同一个分区键,那么这是按照您从SQL世界的想法工作的唯一方法。即使这样,这也取决于您的集群键是什么。我添加了表creational。因此,使用高基数二级索引是一种反模式。根据其值的范围,
dept
group
可能可以,但是
user
date
太独特,无法很好地执行。非常感谢。要求已更改并切换到博士后
aploetz@cqlsh:stackoverflow> CREATE TABLE testtable_by_group (group text,id text,orderby int,PRIMARY KEY (group,orderby,id));
aploetz@cqlsh:stackoverflow> INSERT INTO testtable_by_group(group,id,orderby) VALUES ('group1','101',3);
aploetz@cqlsh:stackoverflow> INSERT INTO testtable_by_group(group,id,orderby) VALUES ('group1','102',2);
aploetz@cqlsh:stackoverflow> INSERT INTO testtable_by_group(group,id,orderby) VALUES ('group1','105',1);
aploetz@cqlsh:stackoverflow> SELECT group,id,orderby,token(group) FROM testtable_by_group WHERE group='group1';

 group  | id  | orderby | system.token(group)
--------+-----+---------+----------------------
 group1 | 105 |       1 | -2413872665919611707
 group1 | 102 |       2 | -2413872665919611707
 group1 | 101 |       3 | -2413872665919611707

(3 rows)