cassandra的主键是独一无二的?

时间:2014-02-13 18:31:19

标签: cassandra primary-key create-table

它可能有点蹩脚但是在cassandra中有一个独特的主键? 例如,在下表中:

CREATE TABLE users (
  name text,
  surname text,
  age int,
  adress text,
  PRIMARY KEY(name, surname)
);

那么,如果我的数据库中有2个人可以在我的数据库中拥有相同名称和姓氏但年龄不同的人吗?这意味着相同的主键..

5 个答案:

答案 0 :(得分:10)

是的,主键必须是唯一的。否则,当您使用重复键进行查询时,将无法知道要返回哪一行。

在您的情况下,您可以拥有2行具有相同名称或相同姓氏但不能同时使用两者。

答案 1 :(得分:10)

根据定义,主键必须是唯一的。但这并不意味着你无法实现自己的目标。您只需要更改您的方法/术语。

首先,如果您放宽将姓氏+姓氏作为主键的目标,您可以执行以下操作:

CREATE TABLE users ( name text, surname text, age int, address text, PRIMARY KEY((name, surname),age) );
insert into users (name,surname,age,address) values ('name1','surname1',10,'address1');
insert into users (name,surname,age,address) values ('name1','surname1',30,'address2');
select * from users where name='name1' and surname='surname1';

 name  | surname  | age | address
-------+----------+-----+----------
 name1 | surname1 |  10 | address1
 name1 | surname1 |  30 | address2

另一方面,如果您想确保共享地址,那么您可能只想在用户记录中存储一组年龄。这可以通过以下方式实现:

CREATE TABLE users2 ( name text, surname text, age set<int>, address text, PRIMARY KEY(name, surname) );
insert into users2 (name,surname,age,address) values ('name1','surname1',{10,30},'address2');
select * from users2 where name='name1' and surname='surname1';

 name  | surname  | address  | age
-------+----------+----------+----------
 name1 | surname1 | address2 | {10, 30}

所以它回到了你真正需要完成的事情。希望上面的例子能给你一些想法。

答案 2 :(得分:4)

主键是唯一的。使用您的数据模型,每个(姓名,姓氏)组合只能有一个年龄。

答案 3 :(得分:0)

是的,如上所述,您可以使用具有名称,姓氏和年龄的组合键来实现您的目标,但是仍然不能解决问题。相反,您可以考虑添加新的列userID并将其作为主键。因此,即使姓名,姓氏和年龄重复,您也不必重新访问数据模型。

CREATE TABLE users (
  userId int,
  name text,
  surname text,
  age int,
  adress text,
  PRIMARY KEY(userid)
);

答案 4 :(得分:0)

我要特别指出分区键应该是唯一的。我无法将其放在一个地方,只能从以下语句中获取。

  • Cassandra需要所有分区键列才能进行计算 允许其查找包含以下内容的节点的哈希 分区。

  • 分区键在Apache Cassandra中有特殊用途 显示数据库中记录的唯一性。

  • 请注意,如果您插入相同的内容,则不会有任何错误 分区键一次又一次,因为没有约束检查。

  • 您将要运行相等搜索的查询应该在分区中 键。

参考

https://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause

how Cassandra chooses the coordinator node and the replication nodes?

Insert query replaces rows having same data field in Cassandra clustering column