web-dev-qa-db-ja.com

CassandraのUPDATEとINSERTの違いは?

Cassandraに対してCQLを実行する場合のUPDATEINSERTの違いは何ですか?

以前は違いはなかったように見えますが、現在、 ドキュメント は、INSERTはカウンターをサポートしていないが、UPDATEはサポートしていることを示しています。

使用する「推奨」方法はありますか?または、一方を他方に対して使用する必要がある場合がありますか?

本当にありがとう!

43
Chris Dutrow

Cassandraのカウンター列は、任意の値に設定できませんでした。任意の値でのみ増分または減分できます。

このため、カウンター列に値を「挿入」できないため、INSERTはカウンター列をサポートしません。何らかの値でUPDATE(増分または減分)のみできます。カウンター列を更新する方法は次のとおりです。

    UPDATE ... SET name1 = name1 + <value> 

あなたが尋ねた:

使用する「推奨」方法はありますか?または、一方を他方に対して使用する必要がある場合がありますか?

はい。データベースに値を挿入する場合は、INSERTを使用できます。列が存在しない場合は、作成されます。それ以外の場合、INSERTの効果はUPDATEに似ています。 INSERTは、事前に設計されたスキーマがない場合に便利です(動的列ファミリ、つまり、いつでも挿入)。スキーマを事前に設計し(RDMSに似た静的列ファミリ)、各列を知っている場合は、UPDATEを使用できます。

19
goblinjuice

微妙な違いがあります。すべての非キーフィールドをnullに設定すると、INSERTを介して挿入されたレコードは残ります。すべての非キーフィールドをnullに設定すると、UPDATEを介して挿入されたレコードはなくなります。

これを試して:

CREATE TABLE T (
  pk int,
  f1 int,
  PRIMARY KEY (pk)
);

INSERT INTO T (pk, f1) VALUES (1, 1);
UPDATE T SET f1=2 where pk=2;
SELECT * FROM T;

戻り値:

 pk | f1
----+----
  1 |  1
  2 |  2

次に、各行の設定f1をnullに更新します。

UPDATE T SET f1 = null WHERE pk = 1;
UPDATE T SET f1 = null WHERE pk = 2;
SELECT * FROM T;

行2は削除されますが、行1は残っていることに注意してください。

 pk | f1
----+------
  1 | null

Cassandra-cliを使用してこれらを見ると、行の追加方法が異なります。

これが設計によるものなのかバグなのかを知り、この動作が文書化されているのを確認したいです。

47
billbaird

別の微妙な違い(cqlはcassandraへのひどいインターフェイスだと信じ始めていますが、SQL構文は似ていますがセマンティクスが少し異なるため、微妙な点と注意点があります)は、既存のデータにTTLを設定することです。 UPDATEでは、新しい実際の値が古い値と等しい場合でも、キーのTTLを更新できません。解決策は、代わりに新しい行を挿入することです新しいTTL設定済み

1
Hilikus

Billbairdによって強調表示された微妙な違い(その投稿に直接コメントすることはできません)に関して、すべての非キーフィールドがnullの場合、更新操作によって作成された行が削除されます。

これは予想される動作であり、 https://issues.Apache.org/jira/browse/CASSANDRA-11805 (「Not A Problem」としてクローズされた)のバグレポートに基づくバグではありません

初めてSpring Dataを使用したときに、私は自分でこれに遭遇しました。リポジトリのsave(T entity)メソッドを使用していましたが、行が作成されていませんでした。 Spring DataはUPDATEを使用していたことが判明しました。これは、オブジェクトが「新規」ではないと判断したためです(「isNew」のテストが意味をなすかどうかわかりません)。キーフィールドが設定されていました。

このSpring Dataの場合、Cassandra固有のリポジ​​トリインターフェースは、代わりにその動作が必要な場合に一貫してinsertを使用するように見えるINSERTメソッドを提供します(Springのドキュメントにはこれらの詳細が記載されていませんが)十分に)。

0
user1325158