2012-04-14 9 views
0

私は、ストリームテーブル(メモリテーブル)と、このテーブル(1行/分から100行/秒)に挿入されているスクリプトを持っています。 5秒ごとに1000行をフェッチする必要があります。つまり、選択した上位1000行を選択し、その選択した行を削除します。データベーステーブルからどのようにフェッチすることができますか?

私の選択クエリはとてもシンプルです。多分、いくつかの新しい行が私SELECTDELETE時間の間で追加されるので、

SELECT * FROM vdp_stream WHERE user=xxx 

私の問題は、私はDELETEのSQLを照会することはできません実際にあります。私は正しい?テーブルから行をフェッチするソリューションはありますか?

UPDATE私のテーブル構造:

私はUPDATEを使用することをお勧めしテーブルを使用してこれをやって継続しようとしている場合
vdp_stream 
--------------------- 
user CHAR(30) 
x INT 
y INT 
+1

おそらくこのような何かテーブル構造とは何ですか?このタスクでは、RDBMSではなく、メッセージングシステムを使用する必要があるようです。 – nnichols

+0

はい私はそれがRDBMSで悪いことを知っていますが、私はRDBMSデータベースのこのような状況のための解決策を知る必要があります。 –

答えて

1

、SELECTとトランザクション内の文を削除します。

START TRANSACTION; 

UPDATE vdp_stream 
SET selected = 1 
ORDER BY id ASC 
LIMIT 1000; 

SELECT * 
FROM vdp_stream 
WHERE selected = 1; 

DELETE 
FROM vdp_stream 
WHERE selected = 1; 

COMMIT; 

UPDATE - - InnoDBのためのデフォルトの分離レベルを使用すると、アップデートを省略し、単にSELECTを行うと、同じ基準に基づいて削除することができますREPEATABLE READであるとして -

START TRANSACTION; 

SELECT * 
FROM vdp_stream 
ORDER BY id ASC 
LIMIT 1000; 

DELETE 
FROM vdp_stream 
ORDER BY id ASC 
LIMIT 1000; 

COMMIT; 
+0

本当に '選択済み 'が必要ですか?トランザクション中にテーブルがロックされている場合、なぜその列が必要ですか? –

+1

別のオプションで回答を更新しました – nnichols

関連する問題