【问题标题】:CASSANDRA CQL3 : Set value to entire columnCASSANDRA CQL3:将值设置为整列
【发布时间】:2015-10-28 09:25:10
【问题描述】:

对于我的 Cassandra 数据库,我需要在列中为表中的所有行设置一个值。

我在 SQL 中看到,我们可以这样做:

UPDATE table SET column1= XXX;

但在 CQL(在 cqlsh 中)中,它不起作用! 我不想逐行更新,直到 9500 行。

你有什么建议吗?

谢谢你:)

【问题讨论】:

标签: database cassandra cql cql3 cqlsh


【解决方案1】:

如您所见,CQL != SQL。除了遍历表中的每一行之外,没有办法在 CQL 中执行您所要求的操作。

Robert 关于将column1 重新定义为static column 的建议可能会有所帮助。但是静态列与它们的分区键相关联,因此您仍然需要指定:

aploetz@cqlsh:stackoverflow2> UPDATE t SET s='XXX' WHERE k='k';

另外,听起来您只想设置所有行的列值。如果您希望分区内的 CQL 行的列值不同(来自 DataStax 文档中的示例),则静态列对您不起作用:

aploetz@cqlsh:stackoverflow2> INSERT INTO t (k, s, i) VALUES ('k', 'I''m shared', 0);
aploetz@cqlsh:stackoverflow2> INSERT INTO t (k, s, i) VALUES ('k', 'I''m still shared', 1);
aploetz@cqlsh:stackoverflow2> SELECT * FROM t;

 k | i | s
---+---+------------------
 k | 0 | I'm still shared
 k | 1 | I'm still shared

(2 rows)

请注意,s 列的值在分区键 k 下的所有 CQL 行中是相同的。只是为了让您了解它是如何工作的。

【讨论】:

    【解决方案2】:

    您可以使用带有 IN 子句的更新查询,而不是执行 9500 查询。 首先从您的表中选择 primary_key,然后将值复制到此查询:

    UPDATE table SET column1 = XXX WHERE primary_key IN (p1, p2, p3, ...);
    

    【讨论】:

    • 如果主键是复合键(即还有其他集群键)怎么办?
    【解决方案3】:

    我刚刚向表中添加了一个新列(+60000 行),我寻找了用某些东西(非空)初始化列的所有值的方法,但我什么也没找到。这里问的不一样,但是如果您删除并添加列,我的解决方案将解决它。所以,这就是我所做的:

    cqlsh> COPY tablename (primary_key, newcolumn) TO 'FILE.txt'
    

    在记事本++上打开FILE.TXT并按Ctrl+H(替换选项),将所有\r\n替换为'something\r\n'

    最后,

    cqlsh> COPY tablename (primary_key, newcolumn) FROM 'FILE.txt'
    

    注意1:如果你的primary_key包含\r\n,你应该小心。

    注意 2:可能在您的 SO 中,行不以 \r\n 结尾。

    【讨论】:

    • 实际上,cqlsh 允许使用 WITH 关键字导出带有自定义字符串的空值。 ` cqlsh> COPY tablename (primary_key, newcolumn) TO 'FILE.txt WITH NULL='''` 其中 是您的自定义 null 值。
    猜你喜欢
    • 2013-09-28
    • 2013-11-03
    • 2013-08-09
    • 1970-01-01
    • 2013-04-11
    • 2013-07-14
    • 2012-12-16
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多