如何在MySQL表中添加新行时实时检查

时间:2014-01-09 12:10:52

标签: php mysql

我们有一个自动车牌阅读器,记录车辆的车牌进入公司。我的同事问我是否可以立即获得汽车的车牌号码。该软件使用MySQL,我只有数据库访问权限。无法访问/编辑PHP代码。

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

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

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

2 个答案:

答案 0 :(得分: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,但在大多数情况下这似乎是一种过度杀伤。

答案 1 :(得分:0)

虽然这不是最好的设计,但我还没有实现它,有办法通过sys_exec()UDF使用如下所述的触发器调用外部脚本:

  

B.5.11:触发器是否可以通过UDF调用外部应用程序?

     

是。例如,触发器可以调用sys_exec()UDF。

http://dev.mysql.com/doc/refman/5.1/en/faqs-triggers.html#qandaitem-B-5-1-11

另请查看此主题与您的需求相似的内容。

Invoking a PHP script from a MySQL trigger