这更像是一个数据建模问题,但它与轻量级事务有关,因为尝试使用此功能似乎会对我的数据建模方式产生影响。
我的具体用例是我想在INSERT
上的特定字段强制执行唯一性。 Cassandra的文档有以下示例:
INSERT INTO customer_account (customerID, customer_email)
VALUES (‘LauraS’, ‘lauras@gmail.com’)
IF NOT EXISTS;
在我的特定情况下,我有下表:
CREATE TABLE IF NOT EXISTS plugins (
id uuid PRIMARY KEY,
user_id uuid,
name text,
slug text,
major_version int,
minor_version int,
patch_version int
);
我要强制执行的约束是user_id
,slug
,major_version
,minor_version
和patch_version
的组合必须是唯一的。我不能简单地做:
INSERT INTO
plugins (
user_id,
slug,
major_version,
minor_version,
patch_version
) VALUES (...) IF NOT EXISTS;
这是因为我需要name
和id
。但是,包括name
和id
仍会导致事情被写入,因为IF NOT EXISTS
会因id
不同而至少失败(至少),name
也可能不同。
这是否意味着我需要维护一个仅包含user_id
,slug
,major_version
,minor_version
和patch_version
的单独表格?然后我会尝试写入此表,并查看操作的结果。如果写入成功,我将继续填充所有其他关联表。
我知道非正规化是卡桑德拉的生活现实;我只想确保创建此表只是为了处理唯一性的情况。如果这种方法没有意义,请建议另一种方法。谢谢!
答案 0 :(得分:3)
INSERT ... IF NOT EXISTS
会创建一个新行。它不是逐列比较,只是键。如果您要强制user_id
,slug
,major_version
,minor_version
和patch_version
的唯一性,那么这些列需要形成主键。