我的cql有问题,cassandra给了我no viable alternative at input '(' (...WHERE id = ? if [(]...)错误消息。我认为我的陈述有问题。

UPDATE <TABLE> USING TTL 300
  SET <attribute1> = 13381990-735b-11e5-9bed-2ae6d3dfc201
  WHERE <attribute2> = dfa2efb0-7247-11e5-a9e5-0242ac110003
    IF (<attribute1> = null OR <attribute1> = 13381990-735b-11e5-9bed-2ae6d3dfc201) AND <attribute3> = 0;

你知道问题出在声明中吗?

最佳答案

有了完整的表结构会有帮助,所以为了测试您的语句,我做了一些有根据的猜测。
有了这张桌子:

CREATE TABLE lwtTest (attribute1 timeuuid, attribute2 timeuuid PRIMARY KEY, attribute3 int);

只要我不在末尾添加轻量级事务,此语句就可以工作:
UPDATE lwttest USING TTL 300 SET attribute1=13381990-735b-11e5-9bed-2ae6d3dfc201
WHERE attribute2=dfa2efb0-7247-11e5-a9e5-0242ac110003;

你的轻量级事务…
IF (attribute1=null OR attribute1=13381990-735b-11e5-9bed-2ae6d3dfc201) AND attribute3 = 0;

…有一些问题。
cassandra中的“null”与rdbms中的对应项完全不同。不是每一行每一列都需要有一个值。表中那些没有特定列值的cql行将显示“null”,但不能按“null”进行查询,因为它实际上并不存在。
CQL中不存在OR关键字。
不能使用额外的括号分隔where子句或轻量级事务中的条件。
记住这些要点,以下更新和轻量级事务运行时不会出错:
UPDATE lwttest USING TTL 300 SET attribute1=13381990-735b-11e5-9bed-2ae6d3dfc201
WHERE attribute2=dfa2efb0-7247-11e5-a9e5-0242ac110003
IF attribute1=13381990-735b-11e5-9bed-2ae6d3dfc201 AND attribute3=0;

 [applied]
-----------
     False

10-06 14:03
查看更多