【问题标题】:Update query in Cassandra 2.3Cassandra 2.3 中的更新查询
【发布时间】:2016-09-19 23:03:40
【问题描述】:

这是我的表结构如下

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;

但它是插入新记录而不是更新现有记录。

请帮帮我

下面是我要更新 url 列值的表中的数据示例

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 |    

【问题讨论】:

  • 您能否在运行查询之前给出表中数据的示例?在您的情况下,所有 account_sid、file_type 和 file_sid 都必须相同,以便 Cassandra 更新现有记录。如果主键是唯一的,则使用 UPDATE 不会阻止它插入新记录。
  • 我更新了问题请看上面的例子。
  • 您的问题似乎有误。如果您的更新包含完整的 PRIMARY KEY,那么创建新记录是什么意思。您可以发布创建的两个记录吗?不可能有两行具有相同的主键。
  • 另外,没有像 Cassandra 2.3 这样的版本。 2.2 之后的下一个主要版本是 3.0。

标签: php cassandra


【解决方案1】:

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

但您也可以将更新用作更新:只需添加 IF EXISTS;到您的查询。但请记住一件事:这是一个很大的性能杀手。 Cassandra 必须从所有节点读取所有值!

【讨论】:

  • 是的。我得到了它。谢谢
猜你喜欢
  • 1970-01-01
  • 2014-10-21
  • 2015-01-20
  • 2017-03-24
  • 2013-11-02
  • 2017-12-28
  • 2011-02-02
  • 2017-05-10
  • 2015-01-09
相关资源
最近更新 更多