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 ; 1422 - Explicit or implicit commit is not allowed in stored function or trigger.
时间: 2023-06-14 16:05:44 浏览: 50
这个错误提示是因为在触发器中使用了ROLLBACK语句,而在触发器中不允许使用COMMIT或ROLLBACK语句,因为这些语句会影响到整个事务,而不只是触发器本身。
为了解决这个问题,你可以考虑使用SIGNAL语句来抛出一个异常,从而回滚事务。例如:
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 = '挂号人数超过最大限度';
END IF;
END $$
DELIMITER ;
这个触发器会在插入GH表的每一行数据后执行。如果插入的行的Gh_no值大于等于100,就会抛出一个45000 SQLSTATE的异常,并且回滚事务。
相关问题
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.
这个错误是因为你在 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 insert_stu after insert on Student for each row begin declare @cid varchar(30); select @cid=Cid from inserted; update Class set Cnumber = Cnumber + 1 where Cid = @cid; end; $$ delimiter ;
这段代码是用于创建一个触发器 (trigger)。触发器是一种特殊的数据库对象,可以在数据库表中的数据发生变化时自动执行特定的操作。
具体来说,这个触发器的名称是 `insert_stu`,它会在 `Student` 表中插入一条记录之后自动触发。`for each row` 表示每插入一行记录就会触发一次该触发器。
在触发器的主体部分,首先声明了一个名为 `@cid` 的变量。这个变量是用来存储插入到 `Student` 表中的记录的 `Cid` 字段值。`declare` 表示声明变量,`varchar(30)` 表示该变量是一个长度为 30 的字符串类型。
接下来,使用 `select` 语句从 `inserted` 表中获取新插入的记录的 `Cid` 字段值,并将其赋值给 `@cid` 变量。`inserted` 是一个特殊的表,用于存储触发器所依赖的数据。在这个例子中,`inserted` 表中存储了新插入的 `Student` 记录的所有字段值。
最后,使用 `update` 语句更新 `Class` 表中的记录,将 `Cnumber` 字段的值增加 1。`where` 子句用于指定更新哪些记录,这里是根据 `Cid` 字段的值来匹配。这表示当向 `Student` 表中插入一条记录时,与该记录相关联的 `Class` 表中的 `Cnumber` 字段值都会自动加 1。
相关推荐
![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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)