如何在CQL3中为复合键列提供空列值

时间:2013-09-23 15:33:17

标签: cassandra cql cql3 playorm

这可能听起来很愚蠢,因为SQL的复合主键中没有空值。但是只想确认我们是否可以在CQL3中使用相同的功能? 所以,我们有一个这样的表来存储宽行:

CREATE TABLE keyspace12.colFamily1 
(
  id text, 
  colname text,
  colvalue blob,
  PRIMARY KEY (id,colname, colvalue)
) WITH COMPACT STORAGE

我们在某些情况下colname为null。我能这样做吗?如果是,那怎么样?如果没有,那么存储宽列行的方法是什么呢?我们可以在cassandra的复合列的第一部分中有一些null(根据Thrift的约定)?

相关问题是: CQL3 and millions of columns composite key use caseCassandra -How to create composite column name (not key) using cqlsh

3 个答案:

答案 0 :(得分:3)

说我有一个列族

CREATE TABLE cnt_test (time_slot text , comp1 text, comp2 text, field1 counter, field2 counter, PRIMARY KEY(time_slot,comp1, comp2));

现在我想在其中插入一些数据

UPDATE cnt_test SET field1=field1+1, field2=field2+2 WHERE time_slot='20130924' AND comp1='' AND comp2='ABC';
UPDATE cnt_test SET field1=field1+1, field2=field2+2 WHERE time_slot='20130924' AND comp1='' AND comp2='ABC';
UPDATE cnt_test SET field1=field1+1, field2=field2+2 WHERE time_slot='20130924' AND comp1='' AND comp2='ABC';
UPDATE cnt_test SET field1=field1+1, field2=field2+2 WHERE time_slot='20130924' AND comp1='' AND comp2='XYZ';
UPDATE cnt_test SET field1=field1+1, field2=field2+2 WHERE time_slot='20130924' AND comp1='PQR' AND comp2='';

正如您在上面的语句中所看到的,我在复合键部分中插入了一些空值,而不是 null 我将空白字符。

我甚至可以查询相同的

 SELECT * FROM cnt_test WHERE time_slot='20130924' AND comp1='' AND comp2='ABC';

 time_slot | comp1 | comp2 | field1 | field2
-----------+-------+-------+--------+--------
  20130924 |       |   ABC |      4 |      8

(1 rows)

SELECT * FROM cnt_test WHERE time_slot='20130924' AND comp1='PQR' AND comp2='';

 time_slot | comp1 | comp2 | field1 | field2
-----------+-------+-------+--------+--------
  20130924 |   PQR |       |      1 |      2

(1 rows)

总而言之,只需用空列替换空列值即''

即可

答案 1 :(得分:1)

我们在某些情况下colname为null。我能这样做吗?

响应,符合预期

如果没有,那么存储宽列行的方法是什么?我们可以在cassandra的复合列的第一部分中有一些空值(按照Thrift的约定)?

您可以使用 cassandra-cli 在Thrift中进行操作。 CQL3无法将主键组件设置为null

答案 2 :(得分:-1)

我需要这样做才能在单个表中建模父/子关系。因此,当我想插入父母时,会填充“id”,并且“colname”将设置为nil。

要做到这一点,解决方案非常简单,将'colname'作为空字符串插入。我可以看到我的select return null返回。