CASSANDRA CQL3:将值设置为整个列
CASSANDRA CQL3 : Set value to entire column
对于我的 Cassandra 数据库,我需要在 table.
中的所有行的列中设置一个值
我在 SQL 中看到,我们可以这样做:
UPDATE table SET column1= XXX;
但在 CQL 中(在 cqlsh 中),它不起作用!
在 9500 行之前,我不想逐行更新。
你有什么建议吗?
谢谢:)
如您所见,CQL != SQL。没有办法在 CQL 中完成您要求的操作,除非遍历 table.
中的每一行
罗伯特关于将 column1
重新定义为 static column 的建议可能会有所帮助。但是静态列与其分区键相关联,因此您仍然需要指定:
aploetz@cqlsh:Whosebug2> UPDATE t SET s='XXX' WHERE k='k';
此外,听起来您只希望能够为所有行设置 一个列值。如果您希望分区内的 CQL 行的列值不同(来自 DataStax 文档中的示例),静态列将不适合您:
aploetz@cqlsh:Whosebug2> INSERT INTO t (k, s, i) VALUES ('k', 'I''m shared', 0);
aploetz@cqlsh:Whosebug2> INSERT INTO t (k, s, i) VALUES ('k', 'I''m still shared', 1);
aploetz@cqlsh:Whosebug2> SELECT * FROM t;
k | i | s
---+---+------------------
k | 0 | I'm still shared
k | 1 | I'm still shared
(2 rows)
请注意,列 s
的值在分区键 k
下的所有 CQL 行中都是相同的。只是为了让您了解它是如何工作的。
您可以使用带有 IN 子句的更新查询来代替执行 9500 查询。
首先从您的 table select primary_key 然后将值复制到此查询:
UPDATE table SET column1 = XXX WHERE primary_key IN (p1, p2, p3, ...);
我刚刚在 table(+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
结尾。
对于我的 Cassandra 数据库,我需要在 table.
中的所有行的列中设置一个值我在 SQL 中看到,我们可以这样做:
UPDATE table SET column1= XXX;
但在 CQL 中(在 cqlsh 中),它不起作用! 在 9500 行之前,我不想逐行更新。
你有什么建议吗?
谢谢:)
如您所见,CQL != SQL。没有办法在 CQL 中完成您要求的操作,除非遍历 table.
中的每一行罗伯特关于将 column1
重新定义为 static column 的建议可能会有所帮助。但是静态列与其分区键相关联,因此您仍然需要指定:
aploetz@cqlsh:Whosebug2> UPDATE t SET s='XXX' WHERE k='k';
此外,听起来您只希望能够为所有行设置 一个列值。如果您希望分区内的 CQL 行的列值不同(来自 DataStax 文档中的示例),静态列将不适合您:
aploetz@cqlsh:Whosebug2> INSERT INTO t (k, s, i) VALUES ('k', 'I''m shared', 0);
aploetz@cqlsh:Whosebug2> INSERT INTO t (k, s, i) VALUES ('k', 'I''m still shared', 1);
aploetz@cqlsh:Whosebug2> SELECT * FROM t;
k | i | s
---+---+------------------
k | 0 | I'm still shared
k | 1 | I'm still shared
(2 rows)
请注意,列 s
的值在分区键 k
下的所有 CQL 行中都是相同的。只是为了让您了解它是如何工作的。
您可以使用带有 IN 子句的更新查询来代替执行 9500 查询。 首先从您的 table select primary_key 然后将值复制到此查询:
UPDATE table SET column1 = XXX WHERE primary_key IN (p1, p2, p3, ...);
我刚刚在 table(+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
结尾。