2014-11-24 81 views
2

我有一个定制列表表与下面的架构删除在Cassandra的CQL表使用IN操作符

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

我按照以下链接 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 

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

回答

2

这是因为IN运算符只能在主键的最后部分或集群键的最后部分工作。我以前认为“元组符号”可以工作,但according to this doc,它只适用于群集列。话虽这么说,使用IN=组合应在任键列工作:

[email protected]: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) 

[email protected]: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”确实不是日期类型之一时)。

+1

我会添加你的另一个[答案](http://stackoverflow.com/a/25729760/2458753)解释为什么一般使用'DELETE'语句不是一个好主意。 – blelump 2014-11-24 13:39:13

+1

正确。经常删除被认为是卡桑德拉的反模式。 – Aaron 2014-11-24 13:40:30