我可以在mysql中启动select语句的触发器吗



每次SELECT表Y中的任何记录时,我都试图在表X上运行INSERT语句。我是否可以仅使用MySQL来实现这一点?

像触发器之类的东西?

简短回答为否。触发器由INSERTUPDATEDELETE触发。

可能的解决方案。相当罕见的情况:

  • 首先,编写一些存储过程做你想要的SELECT表X
  • 然后,限制所有用户仅使用这些存储过程允许他们直接在表上使用SELECTX
  • 然后将存储过程更改为还调用一个存储过程执行您想要的操作(INSERT或其他)

否-您不能在SELECT上触发-您必须创建一个存储过程(或任何其他类型的日志记录工具,如日志文件或其他任何类型的工具),以便在任何查询语句上隐式调用-如果您创建一个调用查询、调用日志记录并返回查询结果的包装器,则会更容易。

如果您试图使用表X来记录表Y上SELECT查询的顺序(一种相当常见的查询记录设置),您可以简单地颠倒操作顺序,先运行INSERT查询,然后运行SELECT查询。

这样,您就不必担心用TRIGGER链接这两个语句:如果您的服务器在这两条语句之间崩溃,那么您已经用第一条语句记录了您关心的内容,并且SELECT查询是否运行对底层数据库没有影响。

如果您没有记录查询,也许您正试图将表Y用作任务队列——我一直在努力解决的这种情况导致我进入了这个线程——并且您希望首先查询Y的会话将所有其他会话锁定在返回的行之外,这样您就可以对结果执行一些操作,并将输出插入到表X中。在这种情况下,只需在Y表中添加一些日志记录功能即可。

例如,您可以向Y添加一个"owner"列,然后将SELECT查询的WHERE部分粘贴到UPDATE语句上,运行它,然后修改SELECT查询以仅显示UPDATE:声明的结果

UPDATE Y SET owner = 'me' WHERE task = 'new' AND owner IS NULL;
SELECT foo FROM Y WHERE task = 'new' AND owner = 'me';

做一些关于foo的工作,然后。。。

INSERT INTO X (output) VALUES ('awesomeness');

同样,关键是先记录,然后查询。

最新更新