在联系MySQL 触发器语句,
但 after 和 before 效果一样,该如何破解。
我的实验环境,Windows,
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.27 |
+-----------+
1 row in set (0.00 sec)
两个表,
mysql> create table g
-> (
-> pid int PRIMARY key AUTO_INCREMENT,
-> pname varchar(20),
-> pnum int,
-> price DECIMAL
-> )
-> ;
Query OK, 0 rows affected (1.61 sec)
mysql> show tables;
+--------------------+
| Tables_in_schooldb |
+--------------------+
| g |
+--------------------+
1 row in set (0.00 sec)
mysql> create table o
-> (
-> oid int primary key AUTO_INCREMENT,
-> pid int,
-> much INT
-> )
-> ;
Query OK, 0 rows affected (0.91 sec)
mysql> show tables;
+--------------------+
| Tables_in_schooldb |
+--------------------+
| g |
| o |
+--------------------+
2 rows in set (0.00 sec)
给o表插入数据,
mysql> insert into g (pname,pnum,price)
-> values
-> ('毛笔',100,5),
-> ('宣纸',100,1),
-> ('墨水',100,10)
-> ;
Query OK, 3 rows affected (0.12 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from g;
+-----+-------+------+-------+
| pid | pname | pnum | price |
+-----+-------+------+-------+
| 1 | 毛笔 | 100 | 5 |
| 2 | 宣纸 | 100 | 1 |
| 3 | 墨水 | 100 | 10 |
+-----+-------+------+-------+
3 rows in set (0.00 sec)
建立一个触发器:
mysql> delimiter //
mysql> create trigger limitprice
-> after update on g
-> for each ROW
-> begin
-> declare mesg varchar(20);
-> if (new.price-OLD.price)*100/old.price>20 then
-> select A002 into mesg;
-> else set mesg='更改成功';
-> end if;
-> end //
Query OK, 0 rows affected (0.12 sec)
mysql> show triggers \G
*************************** 1. row ***************************
Trigger: limitprice
Event: UPDATE
Table: g
Statement: begin
declare mesg varchar(20);
if (new.price-OLD.price)*100/old.price>20 then
select A002 into mesg;
else set mesg='更改成功';
end if;
end
Timing: AFTER
Created: 2022-01-21 15:10:49.42
sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
Definer: root@localhost
character_set_client: gbk
collation_connection: gbk_chinese_ci
Database Collation: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql> update g set price=20 where pid=3;
ERROR 1054 (42S22): Unknown column 'A002' in 'field list'
mysql> select * from g;
+-----+-------+------+-------+
| pid | pname | pnum | price |
+-----+-------+------+-------+
| 1 | 毛笔 | 100 | 5 |
| 2 | 宣纸 | 100 | 1 |
| 3 | 墨水 | 100 | 10 |
+-----+-------+------+-------+
3 rows in set (0.00 sec)
按道理说,trigger 是 after 的,表里的10 应该变成20才对呀!
mysql> show triggers \G
*************************** 1. row ***************************
Trigger: limitprice
Event: UPDATE
Table: g
Statement: begin
declare mesg varchar(20);
if (new.price-OLD.price)*100/old.price>20 then
select A002 into mesg;
else set mesg='更改成功';
end if;
end
Timing: AFTER
Created: 2022-01-21 15:10:49.42
sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
Definer: root@localhost
character_set_client: gbk
collation_connection: gbk_chinese_ci
Database Collation: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql> update g set price=100 where pid=1;
ERROR 1054 (42S22): Unknown column 'A002' in 'field list'
mysql> select * from g;
+-----+-------+------+-------+
| pid | pname | pnum | price |
+-----+-------+------+-------+
| 1 | 毛笔 | 100 | 5 |
| 2 | 宣纸 | 100 | 1 |
| 3 | 墨水 | 100 | 10 |
+-----+-------+------+-------+
3 rows in set (0.02 sec)
但就是不变呀,它应该变的呀,报错归报错,但我写的是after呀,update 在 trigger 之前啊,值应该变啊,
关键是,我看教学视频中,teacher 和我一样的语句,表中的值变化了啊,然后,从 after 改成 before 之后,再 update 值才不会变的,为啥,why,为啥啊,欺负人么?
January the 20th 2022 Friday
这么大个报错没看到么?
ERROR 1054 (42S22): Unknown column 'A002' in 'field list'
由于触发器执行失败,你这个事务都是执行不成功的,相当于你啥都没执行。
就算你把这个报错的位置改正确,你这里的after和before也不会有区别,因为你根本就没在触发器里再去查表里面的数据,也没对new进行赋值,全部都只是查old和new的变量,这两个值是多少不会受after和before的影响
首先,你得确定你跟老师的环境一样
比如老师的数据库到底是mysql吗
mysql版本一样吗
否则你按老师敲的代码执行,然后去对比结果,那就对比了个寂寞
mysql> delimiter //
mysql> create trigger limitprice
-> after update on g
-> for each ROW
-> begin
-> declare mesg varchar(20);
-> if (new.price-OLD.price)*100/old.price>20 then
-> select A002 into mesg;
-> else set mesg='更改成功';
-> end if;
-> end //
Query OK, 0 rows affected (0.12 sec)
ERROR 1054 (42S22): Unknown column 'A002' in 'field list' 这么大的一个错误你看不到?而且 new.price-OLD.price,new喝OLD从哪冒出来的?select A002 into mesg,select A002,A002又是从哪冒出来的,无中生有嘛