DELIMITER $$ CREATE TRIGGER jcxz BEFORE INSERT ON JC FOR EACH ROW BEGIN DECLARE rs VARCHAR(8); SELECT Jc_no INTO rs FROM JC WHERE Jc_no = NEW.Jc_no; IF rs >= 100 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-14 15:05:51 浏览: 55
这个错误是因为你在 trigger 中使用了 ROLLBACK,而 trigger 不允许显式或隐式的 COMMIT 或 ROLLBACK 操作。解决办法是将 ROLLBACK 操作移除,并在触发 SIGNAL 之后让 trigger 自然结束即可。例如:
```
DELIMITER $$
CREATE TRIGGER jcxz BEFORE INSERT ON JC
FOR EACH ROW
BEGIN
DECLARE rs VARCHAR(8);
SELECT Jc_no INTO rs FROM JC WHERE Jc_no = NEW.Jc_no;
IF rs >= 100 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '检查人数超过最大限度';
END IF;
END $$
DELIMITER ;
```
这样,当检查人数超过最大限度时,将触发 SIGNAL,但不会执行 ROLLBACK 操作。
相关问题
DELIMITER $$ CREATE TRIGGER ghxz AFTER INSERT ON GH FOR EACH ROW BEGIN DECLARE rs VARCHAR(8); SET rs = NEW.Gh_no; IF rs >= 100 THEN SELECT * FROM brst; SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '挂号人数超过最大限度'; ROLLBACK; END IF; END $$ DELIMITER ; 1415 - Not allowed to return a result set from a trigger
触发器是在数据库的特定事件发生时自动执行的特殊存储过程。在 MySQL 中,触发器有两种类型:BEFORE 触发器和 AFTER 触发器。BEFORE 触发器在指定操作发生之前执行,因此可以用来验证数据的有效性。AFTER 触发器在指定操作发生之后执行,因此可以用来执行其他操作,例如更新其他表或发送电子邮件通知等。
然而,在触发器中返回结果集是不允许的,因为触发器的主要目的是在指定事件发生时自动执行某些操作,而不是返回数据。如果您需要返回数据,请考虑使用存储过程或函数。
在您的触发器中,您尝试从 SELECT 语句返回结果集,这是不允许的。如果您需要检查一个条件并防止插入操作,您可以使用 SIGNAL 语句生成一个错误,并使用 ROLLBACK 语句回滚插入操作。例如:
```
DELIMITER $$
CREATE TRIGGER ghxz
AFTER INSERT ON GH
FOR EACH ROW
BEGIN
DECLARE rs VARCHAR(8);
SET rs = NEW.Gh_no;
IF rs >= 100 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '挂号人数超过最大限度';
ROLLBACK;
END IF;
END $$
DELIMITER ;
```
这个触发器在插入每一行数据之后执行,如果 `Gh_no` 大于等于 100,则触发器将生成一个错误消息并回滚插入操作。请注意,这个触发器不会返回任何结果集。
create trigger jcxz on JC for insert as declare @rs varchar(8) select @rs=Jc_no from inserted if @rs>=100 begin raiserror('检查人数超过最大限度',16,1); rollback transaction end go改成mysql命令行语法
在 MySQL 中,创建触发器的语法如下:
```
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
trigger_body
```
因此,将上述 SQL Server 的触发器转换成 MySQL 的语法,可以得到以下代码:
```
DELIMITER //
CREATE TRIGGER jcxz
BEFORE INSERT ON JC
FOR EACH ROW
BEGIN
DECLARE rs VARCHAR(8);
SELECT Jc_no INTO rs FROM JC WHERE Jc_no = NEW.Jc_no;
IF rs >= 100 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '检查人数超过最大限度';
ROLLBACK;
END IF;
END //
DELIMITER ;
```
需要注意的是,MySQL 中触发器的语法和部分关键字与 SQL Server 不同,需要进行相应的调整。另外,在 MySQL 中抛出异常需要使用 SIGNAL 语句,而不是 RAISERROR。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)