更新Cassandra DB中的值

时间:2016-09-21 15:22:47

标签: cassandra

我有一个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.

2 个答案:

答案 0 :(得分:0)

我能想到的唯一解决方案是:

  1. 使用应用程序逻辑将所有ID放入列表或数组
  2. 迭代该列表,并像这样使用LWT(轻量级交易)。
  3.   

    更新测试集名称='abc',其中id = ID_FROM_LIST如果name ='ab';

答案 1 :(得分:0)

在我看来,这是一个典型的不幸情况:一个(非常)糟糕的设计。您不应该尝试将C *用作关系数据库。一旦你开始建模,一切都会失败,这是一个与C *无关的典型例子。

我从两个方面看到了这一点:

  1. 您不拥有数据,而且您从头开始。我建议您找到另一种方式来表示您的数据,尤其是不以ID /值对的形式。

  2. 您拥有数据,需要将它们放在数据库中。我建议您通过更改数据库系统并在那里执行转换来采用关系方式。

  3. 然而,还有第三种情况:

    1. 您坚持使用C *,因为您在C *数据库上继承了模型和数据。
    2. 在这种情况下,执行您尝试执行的操作的最佳方式是以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 效率低下......