Cassandra查询中的模运算
我想根据单元格的值更新cassandra表。我想在更新查询中使用模运算符。 不知怎的,是这样的:Cassandra查询中的模运算,cassandra,modulo,cql,Cassandra,Modulo,Cql,我想根据单元格的值更新cassandra表。我想在更新查询中使用模运算符。 不知怎的,是这样的: UPDATE mytable SET mycounter=(mycounter+90)%360 WHERE mykey="keyvalue"; 这怎么可能? 或者我需要获取值,应用模运算并写回它吗? 只要更新的字段有数据类型计数器,就可以添加一些内容,但我不知道如何在查询中应用模运算。哇,这是个好问题。我不确定这一点,所以我想我应该自己测试一下: Connected to Test Cluster
UPDATE mytable SET mycounter=(mycounter+90)%360 WHERE mykey="keyvalue";
这怎么可能?
或者我需要获取值,应用模运算并写回它吗?
只要更新的字段有数据类型计数器,就可以添加一些内容,但我不知道如何在查询中应用模运算。哇,这是个好问题。我不确定这一点,所以我想我应该自己测试一下:
Connected to Test Cluster at 192.168.1.69:9042.
[cqlsh 5.0.1 | Cassandra 2.1.0-rc5-SNAPSHOT | CQL spec 3.2.0 | Native protocol v3]
Use HELP for help.
aploetz@cqlsh> use stackoverflow ;
aploetz@cqlsh:stackoverflow> CREATE TABLE counterModTest (mykey text, mycounter counter, PRIMARY KEY(mykey));
aploetz@cqlsh:stackoverflow> UPDATE countermodtest SET mycounter=mycounter+1 WHERE mykey='keyvalue';
aploetz@cqlsh:stackoverflow> UPDATE countermodtest SET mycounter=mycounter+4 WHERE mykey='keyvalue';
aploetz@cqlsh:stackoverflow> SELECT * FROM countermodtest ;
mykey | mycounter
----------+-----------
keyvalue | 5
(1 rows)
到目前为止,一切顺利。表已创建,值已初始化并递增4。现在来看棘手的部分:
aploetz@cqlsh:stackoverflow> UPDATE countermodtest SET mycounter=mycounter%4 WHERE mykey='keyvalue';
Invalid syntax at line 1, char 46
UPDATE countermodtest SET mycounter=mycounter%4 WHERE mykey='keyvalue';
^
aploetz@cqlsh:stackoverflow> UPDATE countermodtest SET mycounter=mycounter*4 WHERE mykey='keyvalue';
<ErrorMessage code=2000 [Syntax error in CQL query] message="line 1:45 no viable alternative at input '*' (UPDATE countermodtest SET mycounter=[mycounter]*...)">
aploetz@cqlsh:stackoverflow> UPDATE countermodtest SET mycounter=mycounter/4 WHERE mykey='keyvalue';
Invalid syntax at line 1, char 46
UPDATE countermodtest SET mycounter=mycounter/4 WHERE mykey='keyvalue';
^
aploetz@cqlsh:stackoverflow> UPDATE countermodtest SET mycounter=mycounter^2 WHERE mykey='keyvalue';
Invalid syntax at line 1, char 46
aploetz@cqlsh:stackoverflow> UPDATE countermodtest SET mycounter=mycounter-1 WHERE mykey='keyvalue';
aploetz@cqlsh:stackoverflow> SELECT * FROM countermodtest ;
mykey | mycounter
----------+-----------
keyvalue | 4
(1 rows)
我用+、-、*、/、^和%。看起来唯一有效的数学运算符是+和-。好主意,但现在我认为您必须按键查询该行,使用%或任何操作符客户端调整计数器,然后更新它。由于您无法将计数器列设置为特定值,因此您必须将其存储为bigint,或者如果它确实需要作为计数器列,请想出一些其他棘手的方法来更新它。或者……想出一些其他棘手的方法来更新它。是的,记住分布式环境和最终的一致性。对卡桑德拉来说,先读后写并不是一个万无一失的计划。