【问题标题】:Cassandra: update or insert map value together with other valuesCassandra:更新或插入地图值以及其他值
【发布时间】:2020-11-04 08:13:43
【问题描述】:

我有一张如下所示的表格:

(id, a, b, mapValue)

如果存在,我想更新,如果不存在,我想插入VALUES(id,a,b,mapValue)。其中 mapValue 是旧 mapValue 与新 mapValue 的组合,替换了已经存在的每个键的值。

例如,如果旧的 mapValue 是 {1:c, 2:d},而新的 mapValue 是 {2:e, 3:f},则结果将是 {1:c, 2:e, 3:f}。 我想在一个查询中执行此操作,该查询还更新/插入id,a,b 到VALUES(id,a,b,mapValue)。

我怎样才能做到这一点? 我找到了关于更新地图的this 指南,但它没有说明在处理表中的其他值时更新它们的任何内容。我需要同时这样做。

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    在 Cassandra 中,INSERT 和 UPDATE 之间没有区别 - 一切都是 UPSERT,所以当您执行 UPDATE 并且数据不存在时,它会被插入。或者如果你做INSERT并且数据已经存在,它将被更新。

    关于地图更新,可以在UPDATE时对对应列进行+和-操作。比如我有一张桌子:

    CREATE TABLE test.m1 (
        id int PRIMARY KEY,
        i int,
        m map<int, text>
    );
    

    我可以执行以下操作来更新现有行:

    cqlsh:test> insert into test.m1 (id, i, m) values (1, 1, {1:'t1'});
    cqlsh:test> select * from test.m1;
    
     id | i | m
    ----+---+-----------
      1 | 1 | {1: 't1'}
    
    (1 rows)
    
    cqlsh:test> update test.m1 set m = m + {2:'t2'}, i = 4 where id = 1;
    cqlsh:test> select * from test.m1;
    
     id | i | m
    ----+---+--------------------
      1 | 4 | {1: 't1', 2: 't2'}
    
    (1 rows)
    

    我可以使用类似的UPDATE 命令插入全新的数据:

    cqlsh:test> update test.m1 set m = m + {6:'t6'}, i = 6 where id = 6;
    cqlsh:test> select * from test.m1;
    
     id | i | m
    ----+---+--------------------
      1 | 4 | {1: 't1', 2: 't2'}
      6 | 6 |          {6: 't6'}
    
    (2 rows)
    

    通常,如果您知道给定主键之前不存在数据,那么UPDATE 和+ 是插入数据到set 或map 的更好方法,因为它不会生成一个墓碑当您在集合列上没有+ 时执行INSERT 或UPDATE 时生成。

    附:您可以在following document 中找到有关使用集合的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      相关资源
      最近更新 更多