我想用Cassandra 2.0 +使用CQL,这看起来像
BATCH BEGIN;
UPDATE keyspace.Table SET column = "value" IF EXISTS
INSERT keyspace.Table (...) VALUES (...) IF NOT EXISTS
BATCH END;
基本上要插入/更新每个项目的两个语句;这基本上应该模仿T-SQL的MERGE行为
这是我想要执行的任务的正确假设吗?
答案 0 :(得分:9)
INSERT
和UPDATE
是相同的调用,因为在存储层,您实际上只有更新。在CQL中,INSERT
和UPDATE
作为语法糖暴露,使CQL更像SQL。存在轻微的细微差别,例如UPDATE
语句采用WHERE
子句并且还用于递增计数器表,但是当CQL转换为CQL时,它们不会真正影响基础PUT语义。存储层。
IF NOT EXISTS
中使用的INSERT
或IF
一起使用的 UPDATE
告诉Cassandra在后端执行比较和交换操作。这意味着只有满足前提条件才会执行操作。这需要达成共识,因此在分布式设置中(例如,超过1个Cassandra节点),这可能会导致性能损失。
因此,我不认为这反映了SQL MERGE的行为。它确实具有的共同点是两种变体都要求服务器获取行锁以便以原子方式执行操作。