Cassandra выбирает первичный ключ без имени первичных ключей

Используя CQL 3, я, по сути, хочу сделать такое заявление....

SELECT * FROM columnFamilyName WHERE <PK>=1;

Где <PK> — это общий термин для первичного ключа.

Если у меня есть 2 таблицы, в одной из которых имя первичного ключа — ID, а в другой — индекс, приведенный выше оператор должен работать для обеих.

В некотором смысле aerospike поддерживает это (первичный ключ в aerospike просто не имеет имени), но я не уверен, как получить такое же общее имя первичного ключа в cassandra.


person Mr. MonoChrome    schedule 13.05.2014    source источник


Ответы (2)


Укеми, я не знаю, что это возможно, потому что таблица Cassandra может иметь составной первичный ключ, а первая часть первичного ключа также может быть составным ключом раздела.

Например. в этой ситуации:

CREATE TABLE .... PRIMARY KEY ((a, b), c, d) ..

Относится ли ‹PK› к a, b, c или d?

Конечно, если это возможно, я тоже хотел бы знать!

Ваше здоровье,

person reggoodwin    schedule 13.05.2014

CQL не имеет общего термина для первичного ключа; вместо этого вам нужно будет предоставить его явно. Предположительно, приложение или скрипт, который читает из Cassandra, уже знает схему и, следовательно, знает имена ключей.

Однако, если вы хотите получить имена столбцов первичного ключа программно, вот один из подходов: используйте системные таблицы Cassandra для запроса определений таблиц и проанализируйте результаты, чтобы выбрать имена ключей.

Например, вот простая таблица с простым первичным ключом (ключом раздела):

cqlsh:key1> create table table1 (a int, b int, c int, primary key (a));
cqlsh:key1> select column_name,component_index,type from system.schema_columns 
        ... where keyspace_name='key1' and columnfamily_name='table1';

 column_name | component_index | type
-------------+-----------------+---------------
           a |            null | partition_key
           b |               0 |       regular
           c |               0 |       regular

А вот немного более сложный первичный ключ, как предложил @reggoodwin:

cqlsh:key1> create table table2 (a int, b int, c int, d int, e int, 
        ... primary key ((a, b), c, d));
cqlsh:key1> select column_name,component_index,type from system.schema_columns
        ... where keyspace_name='key1' and columnfamily_name='table1';

 column_name | component_index | type
-------------+-----------------+----------------
           a |               0 |  partition_key
           b |               1 |  partition_key
           c |               0 | clustering_key
           d |               1 | clustering_key
           e |               2 |        regular

Для получения дополнительной информации посетите страницу документации по Запрос к системной таблице< /а>.

person BrianC    schedule 20.05.2014