我有一个带有以下架构的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
有人能告诉我执行查询时出错的原因吗?
答案 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"真的不是日期类型之一)。