更新Cassandra 2.3

时间:2016-05-23 07:11:09

标签: php cassandra

这是我的表格结构如下

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 |    

1 个答案:

答案 0 :(得分:4)

好的,关于cassandra你必须知道的一件事:更新或插入不存在。我知道,你在查询中写道,更新或插入,但它是一样的。它被称为Upsert。你可能会想:Whaaat?但有一个原因:Cassandra是一个无主的分布式数据库系统。通常,您没有交易。如果向node1插入一个值并希望在node2上10ms后更新它,则可能会发生第一个值不在node2上。如果硬盘更新,第二次操作将失败。但是cassandra忽略了这个事实并将值写入node2。在一段时间之后,node2和node1将同步它们的值。在此阶段,node1从node1获取正确的值。 (Cassandra使用内部列时间戳进行同步)

但您也可以使用update作为更新:只需添加IF EXISTS;对你的查询。但请记住一件事:它是一个重要的性能杀手。 Cassandra必须读取所有节点的所有值!