2012-04-14 76 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

相关问题