使用MySQL 5.1.36,我试图编写触发器,将临时表从“临时”数据库中删除。
CREATE DEFINER=`root`@`localhost` TRIGGER
`jobq`.`DropScratch`
BEFORE DELETE ON jobq.jobq FOR EACH ROW
BEGIN
DECLARE tblname VARCHAR(128);
set tblname=concat('scratch.',OLD.jobname);
DROP TABLE IF EXISTS tblname;
END;
我总是收到错误:
Explicit or implicit commit is not allowed in stored function or trigger.
我可以以某种方式克服这个限制吗?
事先谢谢你 阿尔曼
答案 0 :(得分:1)
这里的主要问题是不允许您在触发器中删除表。这是错误消息在不允许“隐式提交”时得到的内容。 drop table执行隐式提交。
因此除了触发器之外,您还需要找出一种不同的方法来做到这一点。一种方法是设置一个cron作业,它将information_schema.tables中的数据与jobq表进行比较,以查找可以删除的临时数据库中的表,然后删除它们。
我还应该指出,您尝试动态创建drop table语句的方式不起作用。这将删除一个名为字面意思“tblname”的表,而不是“scratch.jobname”。如果要动态删除表,则需要使用单独的脚本语言(如python,perl,shell等)构建drop table语句。
祝你好运!