Cassandra 中的 ON CONFLICT 运算符

Posted

技术标签:

【中文标题】Cassandra 中的 ON CONFLICT 运算符【英文标题】:ON CONFLICT operator in Cassandra 【发布时间】:2021-08-21 17:47:37 【问题描述】:

我在 Cassandra 中有一个包含 2 列的表:id 和 date_proc,并计划插入大量插入。是否可以在 Postgres 中使用 ON CONFLICT 之类的东西来获取先前的插入值?

您能否告诉我另一种避免向 Cassandra 发出 2 个请求(选择和插入)的方法?也许 DataStax 中有一些解决方案?

ddl:

create table test.date_dict (
    id text,
    date_proc text,
    PRIMARY KEY (id));

插入示例:

INSERT INTO test.date_dict (id, date_proc) VALUES ('1', '2020-01-01'); // return '2020-01-01'
INSERT INTO test.date_dict (id, date_proc) VALUES ('1', '2020-01-05'); // return '2020-01-01'

【问题讨论】:

【参考方案1】:

Cassandra 中的“正常”插入和更新只是追加到内存表中(然后刷新到 SSTables 中)——在这些操作期间不会发生读取。如果时间戳较低,它只会覆盖以前的数据。

您可能可以使用lightweight transactions (LWT) 来实现您所需要的 - 如果存在冲突,它们会返回先前的值(当您使用 IF NOT EXISTS 时,行已经存在,或者值与您在 @987654323 中指定的不同@ 健康)状况)。但 LWT 对性能非常不利,因此应谨慎使用。

我会尝试以这种方式重新制定您的任务,使其适合“正常”插入/更新行为。

【讨论】:

以上是关于Cassandra 中的 ON CONFLICT 运算符的主要内容,如果未能解决你的问题,请参考以下文章

在 ON CONFLICT 子句中使用多个冲突目标

POSTGRES - 使用 ON CONFLICT DO NOTHING 防止串行增量 [重复]

如何在 flask_sqlalchemy 中使用 PostgreSQL 的“INSERT...ON CONFLICT”(UPSERT)功能?

postgresql ON CONFLICT ON CONSTRAINT 用于 2 个约束

Postgresql insert on conflict笔记

Postgres:与CASE一起使用ON CONFLICT