繁体   English   中英

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

[英]How to check in real-time if new row was added to MySQL table

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

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

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

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

如果你的桌子是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,但在大多数情况下这似乎是一种过度杀伤力。

虽然这不是最好的设计,但我还没有实现它,有办法通过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

还可以看看这个类似于您需求的线程。

从MySQL触发器调用PHP脚本

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM