2012-04-14 101 views
0

我有一個流表(內存表),並在這個表中插入一個腳本(從1行/分鐘到100行/秒)。我需要每5秒取1000行,我的意思是選擇前1000行,然後刪除選定的行。如何從數據庫表中獲取(選擇然後刪除)?

我選擇的查詢是如此簡單:

SELECT * FROM vdp_stream WHERE user=xxx 

我的問題是實際上我不能查詢SQL DELETE,因爲也許一些新的行中的時間之間追加,我SELECTDELETE。我對嗎?有沒有解決方案從表中獲取行?

更新我的表結構:

vdp_stream 
--------------------- 
user CHAR(30) 
x INT 
y INT 
+1

什麼是表結構?聽起來你應該使用消息傳遞系統,而不是RDBMS來完成這項任務。 – nnichols 2012-04-14 14:33:27

+0

是的,我知道RDBMS聽起來很糟糕,但我需要知道RDBMS數據庫中類似情況的任何解決方案。 – 2012-04-14 14:36:40

回答

1

如果要繼續使用表我會建議使用UPDATE這樣做,選擇並刪除事務中的語句。像這樣的事情也許 -

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的默認隔離級別是可重複讀,你可以省略更新,只是做了選擇和刪除基於同樣的標準 -

START TRANSACTION; 

SELECT * 
FROM vdp_stream 
ORDER BY id ASC 
LIMIT 1000; 

DELETE 
FROM vdp_stream 
ORDER BY id ASC 
LIMIT 1000; 

COMMIT; 
+0

我真的需要'選擇'嗎?如果表在交易過程中被鎖定,爲什麼我需要該列? – 2012-04-14 14:44:44

+1

我用另一個選項更新了我的答案 – nnichols 2012-04-14 14:47:22

相關問題