Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cassandra中的主键是唯一的?_Cassandra_Primary Key_Create Table - Fatal编程技术网

cassandra中的主键是唯一的?

cassandra中的主键是唯一的?,cassandra,primary-key,create-table,Cassandra,Primary Key,Create Table,这可能有点蹩脚,但在卡桑德拉的主键是独一无二的吗? 例如,在下表中: CREATE TABLE users ( name text, surname text, age int, adress text, PRIMARY KEY(name, surname) ); 那么,在我的数据库中,是否有可能有两个人的名字和姓氏相同,但年龄不同?这意味着相同的主键。主键是唯一的。使用数据模型,每个姓名、姓氏组合只能有一个年龄。是的,主键必须是唯一的。否则,当您使用重复键进行查询时,将无

这可能有点蹩脚,但在卡桑德拉的主键是独一无二的吗? 例如,在下表中:

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

那么,在我的数据库中,是否有可能有两个人的名字和姓氏相同,但年龄不同?这意味着相同的主键。

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

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


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

根据定义,主键必须是唯一的。但这并不意味着你不能完成你的目标。你只需要改变你的方法/术语

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

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}

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

是的,正如上面的评论所提到的,你可以拥有一个包含姓名、姓氏和年龄的组合键来实现你的目标,但这仍然不能解决问题。相反,您可以考虑添加一个新的列USERID,并将其作为主键。因此,即使在姓名、姓氏和年龄重复的情况下,您也不必重新访问数据模型

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

我要特别声明分区键应该是唯一的

Cassandra需要所有分区键列才能进行计算 允许它定位包含 分割

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

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

将对其运行相等搜索的查询应位于分区中 钥匙

参考资料


好公平地说,如果存在重复项,它可以返回两个值:主键名、姓氏、年龄和主键名、姓氏之间的区别是什么,age@PrakashPandey那些是。如所提供的链接所述:复合分区键是由多个列组成的分区键。您可以使用一组额外的括号来括起组成复合分区键的列。主键定义内但嵌套括号外的列是群集列。这些列在分区内形成逻辑集以便于检索。抱歉,这是错误的-分区键不要求唯一-如果您有uniq分区键,则您有仅由一行组成的精简分区。如果您有非唯一的分区键,那么您需要有集群列,以便它们形成uniq主键。我见过一些客户,由于数据模型错误,他们只有一个分区,里面有数百万行,这有点令人困惑。但不是一个处理一系列令牌的节点,因此一组唯一分区映射到一个节点,从而处理这个问题。请也通过链接,因为我引用了他们的大部分。我做了这个测试并检查了一些时间,所以不记得确切的问题是关于标识数据库中单个行的主键。分区键,用于计算令牌并选择要保留数据的节点。单个分区可能包含许多行,每个行由分区内自己的一组集群键标识。