2016-11-10 10 views
1

私はカウンターcom.datastax.driver.coreパッケージを使用しての列、およびクラス内の関数で表を作成します。Cassandraでカウンタ列を削除した後、レコードをリセットするにはどうすればよいですか?

:ようCQLSHからこのI 削除されたテーブルエントリ

public void doStartingJob(){ 
    session.execute("CREATE KEYSPACE myks WITH replication " 
      + "= {'class':'SimpleStrategy', 'replication_factor':1};"); 
    session.execute("CREATE TABLE myks.clients_count(ip_address text PRIMARY KEY," 
             + "request_count counter);"); 
} 

[email protected]:~$ cqlsh 
Connected to Test Cluster at 127.0.0.1:9042. 
[cqlsh 5.0.1 | Cassandra 3.9 | CQL spec 3.4.2 | Native protocol v4] 
Use HELP for help. 

cqlsh:myks> DELETE FROM clients_count WHERE ip_address='127.0.0.1'; 

そして同じ主キーと行を挿入するために、私は(cqlsh介して)ステートメントを以下の使用:

UPDATE myks.clients_count SET request_count = 1 WHERE ip_address ='127.0.0.1'; 

そして、それは、次のように許可されていません。

InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot set the value of counter column request_count (counters can only be incremented/decremented, not set)" 

しかし、私がしたいレコードのカウンタ列の値が1に設定され、同じプライマリキーを持つべきです。 (機能要件)

どのように同じを行うには?

答えて

2

カウンタの使用方法はちょっと変わっていますが、慣れてきます。しかし、主なことは、カウンターはを再利用することができないということです。。特定のプライマリキーのカウンタ値を削除すると、このカウンタは失われます永遠に。これは設計によるもので、私は変更するつもりはないと思います。

質問に最初に戻って、問題の最初はDELETEです。しないでください。

第2に、プライマリキーのカウンタ値が存在しない場合、C *はを処理します。デフォルトではです。あなたが問題に持って初めてカウンタにデータをロードするために、以下のthe documentation

UPDATE mysecurity.clients_count SET request_count = request_count + 1 WHERE ip_address ='127.0.0.1'; 

そしてSELECTすることは正しい答えを返します。ここでも1

、削除の用心します!しないでください!そうした場合、それ以降のクエリ:

UPDATE mysecurity.clients_count SET request_count = request_count + 1 WHERE ip_address ='127.0.0.1'; 

ませは失敗しますが、カウンタはは更新されません。

注意すべきもう一つは、C *は、原子読み取りをサポートして(または更新を更新し、カウンターの列にを読んでいないということです。あなたは、更新を発行し、同じクエリ内の新しいを得ることができない(あるいは2つの異なるクエリを実行する必要があります.1つはSELECTで、もう1つはUPDATEですが、マルチクライアント環境では、の値はUPDATEの間にカウンタ値を反映できませんでした。

これを過小評価すると、あなたのアプリは間違いなく失敗します。

+0

は、UPDATEマイクの後のDELETEの後です。clients_count SET request_count = 1 WHERE ip_address = '127.0.0.1';私がUPDATE myks.clients_count経由で再更新するときSET request_count = request_count +1 WHERE ip_address = '127.0.0.1';私は削除した値でカウンタを更新しています。 –

+0

ありがとうございます@ xmas79 –

+0

**カウンターレコードは決して削除されません** [THIS。](http://stackoverflow.com/a/13694777/7081346)を参照してください。 –

関連する問題