CQL 在输入 '(' 错误时没有可行的选择

CQL no viable alternative at input '(' error

我的 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; 

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

拥有完整的 table 结构会有所帮助,因此为了测试您的陈述,我做了一些有根据的猜测。

有了这个table:

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 不相似(完全)。并非每一行的每一列都需要有一个值。 table 中某些列值没有值的 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