5

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

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

我们有一些 colname 为空的情况。我可以这样做吗?如果是,那么如何?如果否,那么存储宽列行的方法是什么,我们可以在 cassandra 的复合列的第一部分有一些空值(根据 Thrift 的约定)?

相关问题是: CQL3 和百万列复合键用例Cassandra -How to create composite column name (not key) using cqlsh

4

3 回答 3

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)

所以总结每件事只需用空列替换空列值,即''

于 2013-09-24T14:47:54.807 回答
1

我们有一些 colname 为空的情况。我可以这样做吗?

响应是no,正如预期的那样

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

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

于 2013-09-24T11:26:53.227 回答
-1

为了在单个表中建模父/子关系,我需要做同样的事情。因此,当我想插入一个父项时,会填充“id”并且您的“colname”将设置为 nil。

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

于 2017-04-02T01:59:23.310 回答