目录
第1个 从MySQL版本5.0开始,就支持在触发器中使用CALL语句来调用存储过程。
第2个Not allowed to return a result set from a trigger
第4个 新版本的 MySQL 中,使用 SET PASSWORD 语句设置用户密码时,可以不使用 PASSWORD() 函数
今天学习MySQL,有一些坑真的是想不到(写的有点笨拙,小声吐槽)
找这些东西实在是有点吹吹毛求疵了,我这样学习是不对的,还是应该跟着课程学重点才好
第1个 从MySQL版本5.0开始,就支持在触发器中使用CALL语句来调用存储过程。
在25.4.4节中
但是从MySQL版本5.0开始,就支持在触发器中使用CALL语句来调用存储过程。
在此之前,MySQL确实不支持CALL语句,并且在触发器中也不支持使用存储过程。
所以,如果你使用的MySQL版本低于5.0,那么你无法在触发器中使用CALL语句。如果你需要在触发器中操作存储过程,你可以将存储过程中的代码直接放到触发器代码中,或者在触发器中调用一个函数来完成需要的操作。
第2个Not allowed to return a result set from a trigger
在25.4.1节
CREATE TRTGGER neworder AFTER TNSERT ON orders
FOR EACH ROW SELECT NEW.order_num;
--出现错误Not allowed to return a result set from a trigger
查找原因是:MYSQL5以后,不允许触发器返回任何结果
触发器调用存储过程,存储过程中返回结果集也不允许(靠)!
第3个 使用Begin...End语句的一个坑
写一个触发器,执行单条语句是OK的。
想执行多条语句,尝试在代码中加入BEGIN END。但一加BEGIN END就报错, 错误信息也很诡异,只说某一行出错了,不符合Mysql的语句规范,提示信息就个''。
这是23.3.2节的原文
问题是,他说的命令行客户机中报错,其实在workbench中他也不行,必须重新定义分隔符
不仅如此,在定义触发器时使用BEGIN END,他也不行,也要重新定义分隔符。
就很坑,害我看了半天也不知道错在哪
说是没有定义查询界定符导致,导致编译器将;识别为全部语句的结束,导致BEGIN 匹配不到END,于是报错。
解决方案是,在语句前面增加 DELIMITER // (无分号)也就是需要定义分界符。
这样改过之后,就可以运行了。
改成这样就OK了
第4个 新版本的 MySQL 中,使用 SET PASSWORD
语句设置用户密码时,可以不使用 PASSWORD()
函数
原文第28.2.4节
第5个 牛马GRANT ALL||REVOKE ALL
当这样授权时
GRANT ALL ON users.* TO aaa;
不能通过这样移除权限
REVOKE ALL ON users.* FROM aaa;