删除在Cassandra的CQL表使用IN操作符
问题描述:
我有一个定制列表表与下面的架构删除在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
有人能告诉我执行查询时出错的原因吗?
答
这是因为IN
运算符只能在主键的最后部分或集群键的最后部分工作。我以前认为“元组符号”可以工作,但according to this doc,它只适用于群集列。话虽这么说,使用IN
与=
组合应在任键列工作:
[email protected]:*> 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]:*> 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”确实不是日期类型之一时)。
我会添加你的另一个[答案](http://*.com/a/25729760/2458753)解释为什么一般使用'DELETE'语句不是一个好主意。 – blelump 2014-11-24 13:39:13
正确。经常删除被认为是卡桑德拉的反模式。 – Aaron 2014-11-24 13:40:30