2014-01-09 39 views
4

我们有一个自动车牌阅读器,记录汽车进入公司的车牌。我的同事问我是否可以立即得到车的车牌号码。该软件使用MySQL,我只有数据库访问权限。无法访问/编辑PHP代码。如何将新行添加到MySQL表中实时检查

我的提议是定期检查使用查询。例如10秒钟。但通过这种方式,可能会在5秒内错过汽车。然后减小间隔会增加请求/响应计数,这意味着服务器的额外负载。 我不希望脚本始终运行。它应该只运行一个新的数据库行添加。它显示板块并退出。

如何在插入后立即从db获取最后记录的行?我的意思是应该有插入后运行我的PHP脚本的触发器。但是我不知道。

我想要的是MySQL可以在新记录后运行我的PHP脚本。

+0

可能重复[查询设置时间?](http://stackoverflow.com/questions/20929045/querying-for-a-set-time) –

+0

您有权访问php板块插入脚本吗? – Syd

+0

@PanagiotisGeorgeRaditsas不,我没有访问脚本,正如我所提到的。我只能读取db。 – zkanoca

回答

2

如果你的表是MyISAM的,我会坚持你最初的想法。从MyISAM表中获取行计数是即时的。由于MyISAM始终保持行数,因此只需读取一个值。

对于InnoDB,这种方法仍然可以接受。假设car_table.id是主键,SELECT COUNT(id) FROM car_table只需要索引扫描,这是非常快的。您可以通过添加其他索引布尔列到表改善这种想法:

ALTER car_table ADD COLUMN checked BOOLEAN NOT NULL DEFAULT 0, ADD INDEX (checked); 

默认值确保新车将使用此标志设置为0,而无需修改插入语句插入。然后:

BEGIN TRANSACTION; -- make sure nobody interferes 
SELECT COUNT(checked) FROM car_table WHERE checked = FALSE FOR UPDATE; -- this gets you the number of new, unchecked cars 
UPDATE car_table SET checked = TRUE WHERE checked = FALSE; -- mark these cars as checked 
COMMIT; 

这样,您只能在每个轮询中扫描非常少量的索引条目。

更高级的方法在于通过触发器将新创建的汽车ID添加到边桌中。此边桌每隔一段时间扫描一次,不锁定主表,也不改变其结构。每次轮询后,只需要TRUNCATE这个旁边的桌子。

最后,根据Panagiotis的建议,可以选择触发UDF,但在大多数情况下这似乎是一种矫枉过正。

+0

好方法! +1“MyISAM始终保持行数” – Syd

+0

这也出现在我的脑海中:从触发器内写入外部文件(使用['SELECT ... INTO OUTFILE'](http://dev.mysql .com/doc/refman/5.6/en/select-into.html)),并用['inoticoming'](http://askubuntu.com/questions/43846/how-to-put-一个触发式-A-目录/ 43848#43848)。但是,如果你采取这种方式,请不要告诉任何人我建议这样做。我会否认。 – RandomSeed

相关问题