2015-10-15 57 views
2

我有一個問題,我的定製列表和Cassandra是給我no viable alternative at input '(' (...WHERE id = ? if [(]...)錯誤消息。我覺得這是我的說法有問題。CQL在輸入端沒有可行的替代辦法「(」錯誤

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; 

任何想法是在問題是有關語句

回答

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 
+0

偉大的答案!因此,我沒有發現在文件中有括號和OR條件的陳述。 – imalik8088

+1

有關'null'的信息也非常有用,並且很好理解,因爲在cql shell中實際看到的值爲'null'。 – imalik8088