我有一个cassandra数据库,我想更新表中的所有列。
但是列已设置
示例:
Table1
Id value
1 ab
2 ab,cd
3 cd
Now, I want to change all "ab" to "abc".
我知道正常的更新命令在这里不起作用,有没有办法实现这个目标?
update table1 set value =abc where value =ab // This wont work.
答案 0 :(得分:0)
我能想到的唯一解决方案是:
更新测试集名称='abc',其中id = ID_FROM_LIST如果name ='ab';
答案 1 :(得分:0)
在我看来,这是一个典型的不幸情况:一个(非常)糟糕的设计。您不应该尝试将C *用作关系数据库。一旦你开始建模,一切都会失败,这是一个与C *无关的典型例子。
我从两个方面看到了这一点:
您不拥有数据,而且您从头开始。我建议您找到另一种方式来表示您的数据,尤其是不以ID /值对的形式。
您拥有数据,需要将它们放在数据库中。我建议您通过更改数据库系统并在那里执行转换来采用关系方式。
然而,还有第三种情况:
在这种情况下,执行您尝试执行的操作的最佳方式是以C *方式执行操作:您必须对数据进行非规范化以满足您的需求。这意味着创建一个允许您执行反向查找的新表。这些方面的内容应该足够了:
CREATE TABLE reverse_table (
value text,
id int,
PRIMARY KEY (value, id)
);
现在,假设您需要多次执行这些转换,下一步是通过从主表中读取所有记录来填充该表。填充此表后,您将拥有一个更新的模型,可用于执行您想要的操作。
警告:您必须保持这两个表同步。
使用此模型,相当于你的
更新table1 set value = abc where value = ab //这不起作用。
是
SELECT id FROM reverse_table WHERE value = 'ab';
然后为每个返回的id执行类似:
**1.** UPDATE table SET value = 'abc' WHERE id = id_from_the_query_above
**2.** DELETE FROM reverse_table WHERE value = 'ab' AND id = id_from_the_query_above;
**3.** INSERT INTO reverse_table (value, id) VALUES ('abc', id_from_the_query_above);
使用 1。更改主表格, 2。 取消隐藏您的' ab' / id从反向表中记录,并使用 3。 挂钩新的' abc' / id对。您可能还希望在BATCH语句中执行这三个查询而不是异步查询,以强制这些表同步。
所有这些对我来说似乎 veeeeery 效率低下......