这是我的表格结构如下
CREATE TABLE manage_files_log (
account_sid uuid,
file_type text,
file_sid timeuuid,
date_created timestamp,
file_description text,
file_name text,
status int,
url text,
PRIMARY KEY ((account_sid, file_type), file_sid)
) WITH CLUSTERING ORDER BY (file_sid DESC)
在此表中我想用查询
更新我的记录UPDATE manage_files_log SET url='$url' WHERE account_sid =e40daea7-b1ec-088a-fc23-26f67f2052b9 AND file_type ='json' AND file_sid=961883e0-208f-11e6-9c41-474a6606bc87;
但它正在插入新记录而不是更新现有记录。
请帮助我
下面是表格中我想要更新网址列值的示例
account_sid | file_type | file_sid | date_created | file_description | file_name | status | url
--------------------------------------+-----------+------------------- -------------------+--------------------------+------------------+-------- ---+--------+-----
e40daea7-b1ec-088a-fc23-26f67f2052b9 | json | e15e02f0-20ab-11e6-9c41-474a6606bc87 | 2016-05-22 00:00:00+0000 | descripton | testUrl1 | 1 |
答案 0 :(得分:4)
好的,关于cassandra你必须知道的一件事:更新或插入不存在。我知道,你在查询中写道,更新或插入,但它是一样的。它被称为Upsert。你可能会想:Whaaat?但有一个原因:Cassandra是一个无主的分布式数据库系统。通常,您没有交易。如果向node1插入一个值并希望在node2上10ms后更新它,则可能会发生第一个值不在node2上。如果硬盘更新,第二次操作将失败。但是cassandra忽略了这个事实并将值写入node2。在一段时间之后,node2和node1将同步它们的值。在此阶段,node1从node1获取正确的值。 (Cassandra使用内部列时间戳进行同步)
但您也可以使用update作为更新:只需添加IF EXISTS;对你的查询。但请记住一件事:它是一个重要的性能杀手。 Cassandra必须读取所有节点的所有值!