0

ストリームテーブル(メモリテーブル)と、このテーブルに挿入するスクリプト(1行/分から100行/秒)があります。5秒ごとに1000行をフェッチする必要があります。つまり、上位1000行を選択してから、選択した行を削除します。

私の選択クエリはとても単純です:

SELECT * FROM vdp_stream WHERE user=xxx

私の問題は、実際にはDELETE sqlをクエリできないことです。これは、iSELECTと。の間にいくつかの新しい行が追加される可能性があるためDELETEです。私は正しいですか?テーブルから行をフェッチするための解決策はありますか?

テーブル構造を更新します。

vdp_stream
---------------------
user CHAR(30)
x    INT
y    INT
4

1 に答える 1

1

テーブルを使用してこれを続行する場合は、トランザクション内でUPDATE、SELECT、およびDELETEステートメントを使用することをお勧めします。おそらくこのようなもの-

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のデフォルトの分離レベルはREPEATABLEREADであるため、更新を省略して、同じ基準に基づいてSELECTとDELETEを実行できます-

START TRANSACTION;

SELECT *
FROM vdp_stream
ORDER BY id ASC
LIMIT 1000;

DELETE
FROM vdp_stream
ORDER BY id ASC
LIMIT 1000;

COMMIT;
于 2012-04-14T14:40:06.640 に答える