delimiter $$ create trigger categ_trig before insert on record for each row begin declare msg varchar(100); if (type = '支出' and category not in ('餐饮','交通','购物','娱乐','教育','生活缴费','医疗','其它')) then set msg = '您输入的类别有误,请在餐饮、交通、购物、娱乐、教育、生活缴费、医疗、其它中选择一项输入'; SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg; elseif (type = '收入' and category not in ('工资','转账','退款','其它')) then set msg = '您输入的类别有误,请在工资、转账、退款、其它中选择一项输入'; SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg; end if; end; $$这段代码有什么错误?
时间: 2023-06-19 22:07:13 浏览: 82
这段代码有一个错误。在触发器中,应该使用 NEW 关键字来引用正在插入的记录。修改后的代码如下:
```
delimiter $$
create trigger categ_trig
before insert on record
for each row
begin
declare msg varchar(100);
if (NEW.type = '支出' and NEW.category not in ('餐饮','交通','购物','娱乐','教育','生活缴费','医疗','其它')) then
set msg = '您输入的类别有误,请在餐饮、交通、购物、娱乐、教育、生活缴费、医疗、其它中选择一项输入';
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
elseif (NEW.type = '收入' and NEW.category not in ('工资','转账','退款','其它')) then
set msg = '您输入的类别有误,请在工资、转账、退款、其它中选择一项输入';
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
end if;
end;
$$
```
相关问题
delimiter $$ create trigger email_trig after insert on user for each row begin declare msg varchar(100); if REGEXP_LIKE(old.email, '^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$') then set msg = ''; else set msg='邮箱输入错误,请重新输入'; SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg; end if; end; $$这段代码有什么错误?
这段代码有两个问题:
1. `old.email` 是不存在的,应该使用 `new.email` 获取插入的新数据的 email。
2. `SIGNAL` 语句中的 `MESSAGE_TEXT` 应该是 `MESSAGE_TEXT` 而不是 `MESSAGE`。正确的语句应该是:
```sql
delimiter $$
create trigger email_trig after insert on user
for each row
begin
declare msg varchar(100);
if REGEXP_LIKE(new.email, '^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$') then
set msg = '';
else
set msg = '邮箱输入错误,请重新输入';
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = msg;
end if;
end;
$$
```
解释一下这段代码: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。
阅读全文