CASSANDRA CQL3:设置整个列的值

7
对于我的Cassandra数据库,我需要为表中的所有行设置列的值。
我发现在SQL中,我们可以这样做:
UPDATE table SET column1= XXX;

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

你有什么建议吗?

谢谢:)


1
有一种类似于静态列的东西,可以被同一分区上的多行共享。http://docs.datastax.com/en/cql/3.1/cql/cql_reference/refStaticCol.html 如果您的行位于同一分区,则可用。 - Robert Wadowski
3个回答

4
你可以使用带有IN子句的更新查询,而不是执行9500个查询。首先从您的表中选择主键,然后将值复制到此查询中:
UPDATE table SET column1 = XXX WHERE primary_key IN (p1, p2, p3, ...);

如果主键是复合的(即还有其他聚簇键),该怎么办? - umop apisdn

1

我刚刚向一个表格中添加了一列(+60000行),并且我正在寻找一种方法来初始化该列的所有值(不为空),但是我没有找到任何方法。虽然这个问题与之前提出的问题不同,但如果您删除并添加该列,我的解决方案将解决此问题。所以,这就是我做的:

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

打开Notepad++,然后打开FILE.TXT文件,按下Ctrl+H(替换选项),将所有的\r\n替换为“something\r\n”。最后,
cqlsh> COPY tablename (primary_key, newcolumn) FROM 'FILE.txt'

注意1:如果您的主键包含\r\n,请小心处理。

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


1
实际上,cqlsh 允许使用“_WITH_”关键字将自定义字符串与空值一起导出。cqlsh> COPY tablename (primary_key, newcolumn) TO 'FILE.txt WITH NULL='<null>''其中“_<null>_”是您的自定义空值。 - Reodont

0

正如你所发现的,CQL != SQL。除了迭代表中的每一行之外,在CQL中没有办法做到你所要求的。

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

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)

请注意,在分区键 k 下的所有 CQL 行中,列 s 的值相同。这样你就明白它是如何工作的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接