Cassandra更新查询没有';不改变数据并且没有改变';不要出错

Cassandra更新查询没有';不改变数据并且没有改变';不要出错,cassandra,datastax,cql,cassandra-3.0,cqlsh,Cassandra,Datastax,Cql,Cassandra 3.0,Cqlsh,您好,当我试图在cqlsh update "Table" set "token"='111-222-333-444' where uid='123' and "key"='somekey'; 它没有抛出任何错误,但令牌的值仍然相同。但是,如果我尝试对其他字段执行相同的查询,则效果很好: update "Table" set "otherfield"='value' where uid='123'

您好,当我试图在
cqlsh

update "Table" set "token"='111-222-333-444' where uid='123' and "key"='somekey';
它没有抛出任何错误,但令牌的值仍然相同。但是,如果我尝试对其他字段执行相同的查询,则效果很好:

update "Table" set "otherfield"='value' where uid='123' and "key"='somekey';

知道为什么Cassandra可以阻止某些字段的更新吗?

最有可能的是该条目是由客户端使用错误的时钟插入的,或者类似的东西。Cassandra中的数据通过写入时间进行“版本化”,甚至可能在将来(取决于用例)。读取时,Cassandra会比较指定列的所有版本的写入时间(磁盘上的数据文件中可能有多个版本),并选择一个具有最高写入时间的版本

您需要检查该列值的写入时间(使用函数)并与当前时间进行比较:

select writetime(token) from Table where uid='123' and "key"='somekey';

结果值以微秒为单位。您可以删除最后3位数字,并使用类似的方法将其转换为人类可以理解的时间。

谢谢@alex您完全正确。发生了一些我不知道为什么的事情,现在数据库中有很多字段已经损坏,并且在将来有写时间。有什么简单的方法可以解决这个问题吗?理论上,你可以使用DSBulk或Spark之类的东西将数据复制到一个新表中,但是如果你使用它,这会破坏TTL…听起来很可怕:)你知道是什么导致了这个问题吗?在本例中,客户端是PHP应用程序,我们并没有改变任何可能影响这一点的代码。我们在AWS上的一个应用程序节点出现了一些硬件问题,如果应用程序节点的日期错误,可能会影响这一点吗?通常是客户端的时钟问题-总是建议运行ntpd