CQL在输入时没有可行的替代方案('错误

时间:2015-10-15 16:52:30

标签: cassandra cql database nosql

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

任何想法都是关于声明的问题吗?

1 个答案:

答案 0 :(得分:2)

这将有助于您拥有完整的表格结构,因此为了测试您的陈述,我做了一些有根据的猜测。

使用此表:

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和轻量级事务运行时没有错误:

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