Cassandraに対してCQLを実行する場合のUPDATE
とINSERT
の違いは何ですか?
以前は違いはなかったように見えますが、現在、 ドキュメント は、INSERT
はカウンターをサポートしていないが、UPDATE
はサポートしていることを示しています。
使用する「推奨」方法はありますか?または、一方を他方に対して使用する必要がある場合がありますか?
本当にありがとう!
Cassandraのカウンター列は、任意の値に設定できませんでした。任意の値でのみ増分または減分できます。
このため、カウンター列に値を「挿入」できないため、INSERT
はカウンター列をサポートしません。何らかの値でUPDATE
(増分または減分)のみできます。カウンター列を更新する方法は次のとおりです。
UPDATE ... SET name1 = name1 + <value>
あなたが尋ねた:
使用する「推奨」方法はありますか?または、一方を他方に対して使用する必要がある場合がありますか?
はい。データベースに値を挿入する場合は、INSERT
を使用できます。列が存在しない場合は、作成されます。それ以外の場合、INSERT
の効果はUPDATE
に似ています。 INSERT
は、事前に設計されたスキーマがない場合に便利です(動的列ファミリ、つまり、いつでも挿入)。スキーマを事前に設計し(RDMSに似た静的列ファミリ)、各列を知っている場合は、UPDATE
を使用できます。
微妙な違いがあります。すべての非キーフィールドを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を使用してこれらを見ると、行の追加方法が異なります。
これが設計によるものなのかバグなのかを知り、この動作が文書化されているのを確認したいです。
別の微妙な違い(cqlはcassandraへのひどいインターフェイスだと信じ始めていますが、SQL構文は似ていますがセマンティクスが少し異なるため、微妙な点と注意点があります)は、既存のデータにTTLを設定することです。 UPDATE
では、新しい実際の値が古い値と等しい場合でも、キーのTTLを更新できません。解決策は、代わりに新しい行を挿入することです新しいTTL設定済み
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のドキュメントにはこれらの詳細が記載されていませんが)十分に)。