这方面有很多困惑,我会尽量简化。
主键是一个通用概念,表示用于从表中检索数据的一个或多个列。
主键可能是SIMPLE,甚至可以声明为内联:
create table stackoverflow_simple (
key text PRIMARY KEY,
data text
);
这意味着它是由单个列组成的。
但主键也可以是COMPOSITE(又名COMPOUND),由更多列生成。
create table stackoverflow_composite (
key_part_one text,
key_part_two int,
data text,
PRIMARY KEY(key_part_one, key_part_two)
);
在COMPOSITE主键的情况下,键的“第一部分”称为PARTITION KEY(在本例中 key_part_one 是分区键),键的第二部分是 CLUSTERING KEY(在本例中 key_part_two)
请注意,分区键和集群键都可以由更多列生成,方法如下:
create table stackoverflow_multiple (
k_part_one text,
k_part_two int,
k_clust_one text,
k_clust_two int,
k_clust_three uuid,
data text,
PRIMARY KEY((k_part_one, k_part_two), k_clust_one, k_clust_two, k_clust_three)
);
这些名字的背后……
-
分区键负责跨节点分发数据。
-
Clustering Key负责分区内的数据排序。
-
主键相当于单字段键表中的分区键(即简单)。
-
复合/复合键就是任意多列键
更多使用信息:DATASTAX DOCUMENTATION
小用法和内容示例
***简单*** 关键:
insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';
表格内容
key | data
----+------
han | solo
COMPOSITE/COMPOUND KEY 可以检索“宽行”(即您可以仅通过分区键进行查询,即使您定义了集群键)
insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 9, 'football player');
insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 10, 'ex-football player');
select * from stackoverflow_composite where key_part_one = 'ronaldo';
表格内容
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo | 9 | football player
ronaldo | 10 | ex-football player
但您可以使用所有键(分区和集群)进行查询...
select * from stackoverflow_composite
where key_part_one = 'ronaldo' and key_part_two = 10;
查询输出
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo | 10 | ex-football player
重要提示:分区键是使用where clause 执行查询所需的最小说明符。
如果您有复合分区键,如下所示
例如:PRIMARY KEY((col1, col2), col10, col4))
您只能通过至少传递 col1 和 col2 来执行查询,这是定义分区键的 2 列。进行查询的“一般”规则是您必须至少传递所有分区键列,然后您可以选择按照设置的顺序添加每个集群键。
所以,有效的查询是(不包括二级索引)
- col1 和 col2
- col1 和 col2 和 col10
- col1 和 col2 以及 col10 和 col 4
无效:
- col1 和 col2 和 col4
- 不包含 col1 和 col2 的任何内容