DELIMITER $$ CREATE TRIGGER ypxz AFTER INSERT ON CF FOR EACH ROW BEGIN DECLARE n INT; SELECT Sl INTO n FROM inserted; IF n >= 20 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '处方药品超过最大限度'; ROLLBACK; END IF; END$$ DELIMITER ; 1422 - Explicit or implicit commit is not allowed in stored function or trigger.
时间: 2023-06-16 07:03:38 浏览: 163
mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法
5星 · 资源好评率100%
这个错误是因为你在触发器中使用了ROLLBACK语句,而这个语句会隐式地提交事务。在MySQL中,触发器是不能包含事务控制语句的,包括COMMIT、ROLLBACK以及START TRANSACTION等。
解决这个问题的方法是将触发器中的ROLLBACK语句替换为SIGNAL语句,用来抛出一个异常,告诉MySQL要回滚事务。你可以在SIGNAL语句中设置一个错误消息,用来告诉用户出现了什么问题。下面是一个修改后的触发器代码示例:
DELIMITER $$
CREATE TRIGGER ypxz
AFTER INSERT ON CF
FOR EACH ROW
BEGIN
DECLARE n INT;
SELECT Sl INTO n FROM inserted;
IF n >= 20 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '处方药品超过最大限度';
END IF;
END$$
DELIMITER ;
请注意,我将ROLLBACK替换为了SIGNAL语句,并设置了SQLSTATE和MESSAGE_TEXT属性。这样,当触发器条件不满足时,MySQL会抛出一个异常,并回滚事务。
阅读全文