在MySQL中观看表的变化?

时间:2008-10-03 14:51:29

标签: mysql database

是否有更好的方法来观察表中的新条目,除了每隔n个时间点或类似的时间选择它?

我有一个外部程序经常更新的表,客户可以在到达时监视这些新数据,如何在不设置固定周期的可重复选择语句的情况下进行此操作?

8 个答案:

答案 0 :(得分:7)

这是我的所作所为: 我为表设置了一些触发器(插入,删除,更新),这些触发器在另一个表中增加一个计数器。我的数据库访问代码保留一个本地计数器并将其与返回的值进行比较,最终将一个bool发送回调用者,回答问题IsDataCurrent()。

我们使用此数据库访问代码的程序可以根据请求进行轮询或检查,然后进行适当的调用以使自己保持最新状态。

我确信还有其他方法可以解决这个问题。不过,它对我很有用。

答案 1 :(得分:7)

在MySQL中,没有比轮询更好的方法(您创建一个特定的表来简化轮询),在其他数据库中,您可以拥有在数据库之外产生影响的触发器。在MySQL triggers中只能在数据库本身内部执行操作(例如,填充帮助程序表)。

答案 2 :(得分:7)

另一种类似的方法是添加

add column Last_Modified TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP 

到每个表并在您的选择查询前面加上比较最后一个请求日期/时间与最大值(Last_Modified)。

数据库通常是 pull 源而不是 push ,因此无论如何,您仍需要以编程方式探测更改。

答案 3 :(得分:6)

如果您拥有对主机的控制权,则可能触发数据库外的行为。

A) This question's answer suggests使用'select into outfile'写入文件,某些系统进程会监视该文件的变化(例如基于inotify的方法,例如node-inotify甚至Grunt-watch可能就足够了)

B)勇敢的人: The answer to this question指出,如果可以将C / C ++加载项安装到数据库服务器,则可以使用用户定义函数(UDF)来调用sys_exec(),从而触发外部进程,或者可能写入实际进程直接在UDF中。

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

(我正在研究这个,对于AWS RDS托管的应用程序,所以很遗憾,这些选项都不适合我。)

答案 4 :(得分:1)

这只是对您的方法的一个小改进。在您正在观看的表上写一个触发器来更新Last_Changed表。

答案 5 :(得分:0)

对于那些正在执行此操作的人。您可以在任何表上启用binlog并读取binlog以进行新的插入/更新/删除。有一个go软件包here可以解决问题。 here是一个示例实现。

答案 6 :(得分:-3)

如果你足够了解SQL,你可以编写触发器和警报。

答案 7 :(得分:-4)

nodejs + websockets可以解决这个问题!