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

时间:2011-05-26 11:45:26

标签: mysql database triggers

我试图在表格X上运行INSERT语句每次SELECT来自表Y的任何记录都在那里,我只能使用MySQL来实现这一点吗?

触发器之类的东西?

3 个答案:

答案 0 :(得分:24)

简短回答是否定。触发器由INSERTUPDATEDELETE触发。

这个(奇怪的)senario的可能解决方案:

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

答案 1 :(得分:4)

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

答案 2 :(得分:0)

如果您尝试使用表X记录表Y上SELECT个查询的顺序(一种相当常见的查询记录设置),则可以简单地反转操作顺序并运行{{1 }}先查询 ,然后 运行您的INSERT查询。

那样,您不必担心用SELECT链接两个语句:如果服务器在两个语句之间崩溃,则您已经记录了您对第一个语句的关心,以及TRIGGER查询运行或失败对基础数据库没有影响。

如果您不记录查询,也许您正试图将表Y用作任务队列-我当时在这种情况下苦苦挣扎,导致我进入该线程-并且您希望首先锁定哪个会话查询Y返回行中的所有其他会话,因此您可以对结果执行一些操作,然后将输出插入表X。在这种情况下,只需向表Y添加一些日志记录功能。

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

UPDATE

...对foo做一些工作,然后...

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

同样,关键是先登录 ,然后进行查询。