使用IN运算符在cassandra cql表中删除

时间:2014-11-24 10:26:31

标签: cassandra cql

我有一个带有以下架构的cql表

  CREATE TABLE temp_date_time_wise (
  date text,
  timeuid timeuuid,
  temperature text
  PRIMARY KEY (date, timeuid)
)

通过以下链接了解使用IN运算符的可行性 http://mechanics.flite.com/blog/2014/01/08/the-in-operator-in-cassandra-cql/ 现在,当我尝试使用IN运算符对集群密钥执行删除操作时,如下所示

  delete from temp_date_time_wise where date in ('2014-11-17 00:00:00.0') and timeuid in (964966d0-6e1c-11e4-8362-5c260a5fc28f);

我收到以下错误

Bad Request: Invalid operator IN for PRIMARY KEY part timeuid

有人能告诉我执行查询时出错的原因吗?

1 个答案:

答案 0 :(得分:2)

这是因为IN运算符仅适用于主键的最后部分或集群键的最后部分。我之前想过"元组符号"会工作,但according to this doc,它只适用于群集列。话虽如此,使用IN=结合使用应该适用于任一键列:

aploetz@cqlsh:stackoverflow> SELECT * FROM temp_date_time_wise 
WHERE date = '2014-11-17 00:00:00.0' 
AND timeuid IN (964966d0-6e1c-11e4-8362-5c260a5fc28f);

 date                  | timeuid                              | temperature
-----------------------+--------------------------------------+-------------
 2014-11-17 00:00:00.0 | 964966d0-6e1c-11e4-8362-5c260a5fc28f |         34C

(1 rows)

aploetz@cqlsh:stackoverflow> SELECT * FROM temp_date_time_wise
WHERE date IN ('2014-11-17 00:00:00.0') 
AND  timeuid = 964966d0-6e1c-11e4-8362-5c260a5fc28f;

 date                  | timeuid                              | temperature
-----------------------+--------------------------------------+-------------
 2014-11-17 00:00:00.0 | 964966d0-6e1c-11e4-8362-5c260a5fc28f |         34C

(1 rows)

我应该警告你,即使它确实有效,该声明可能不会表现良好。您应该阅读此DataStax文档,特别是标题为When Not To Use IN的部分:

  

关于何时不使用索引的建议适用于在WHERE子句中使用IN。在大多数情况下,不建议在WHERE子句中使用IN。使用IN会降低性能,因为通常必须查询许多节点。

另外,请考虑使用不同的列名。保留字,如timeuuid和非特定字样,如" date"可能会导致问题和混淆(特别是当" date"真的不是日期类型之一)。