我想在cassandra中做出独特的约束。 因为我希望列中的所有值在我的列族中都是唯一的 例如: 名称 - 拉胡尔 手机-123 地址-ABC
现在我希望我这一行没有等于rahul的值,123和abc再次插入数据存储上的seraching我发现我可以通过对分区键执行查询来实现它,因为IF NOT EXIST,但是没有得到解决方案让所有3个值成为唯一的 意味着是否 name-jacob 手机-123 地址QWE
这也应该不会插入到我的数据库中,因为我的手机列与我用name-rahul显示的值相同。
答案 0 :(得分:3)
简短的回答是Cassandra不支持任何类型的约束。它们太昂贵了,因为它们必须涉及多个节点,因此首先要破坏最终一致性的目的。如果您需要使单个列唯一,那么可能有一个解决方案,但不是更多的唯一列。出于同样的原因 - 没有隔离,没有一致性(来自ACID的C和I)。如果您确实需要使用Cassandra进行此类强制执行,那么您将需要创建某种同步应用程序层,该层将拦截对数据库的所有请求,并确保这些值是唯一的,并且所有约束都被强制执行。但这与Cassandra没有任何关系。
答案 1 :(得分:0)
我知道这是一个老问题,现有答案是正确的(您不能在C *中进行约束),但是您可以使用批处理创建来解决问题。创建一个或多个其他表,每个表都将受约束的列作为主键,然后批量创建,这是一个原子操作。如果这些列值中的任何一个已经存在,则整个批处理将失败。例如,如果表名为 Foo ,则还要创建 Foo_by_Name (主键名称), Foo_by_Phone (主键Phone)和 Foo_by_Address (主键地址)表。然后,当您要添加一行时,创建一个包含所有4个表的批处理。您可以复制每个表中的所有列(如果要按名称,电话或地址来获取,则很方便),也可以仅包含名称,电话或地址的一列。