它可能有点蹩脚但是在cassandra中有一个独特的主键? 例如,在下表中:
CREATE TABLE users (
name text,
surname text,
age int,
adress text,
PRIMARY KEY(name, surname)
);
那么,如果我的数据库中有2个人可以在我的数据库中拥有相同名称和姓氏但年龄不同的人吗?这意味着相同的主键..
答案 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