MySQL触发器未正确检查变量

MySQL触发器未正确检查变量,第1张

概述我是MySQL触发器的新手,并且如果条目无效,则想防止条目存储在数据库中.在这种情况下,我想检查模块年份是否大于课程中的年份.这是我的过程(此过程在插入之前执行).SELECT num_of_years INTO @num_years FROM courses WHERE courses.course_id = NEW.course_id; IF NEW.

我是MySQL触发器的新手,并且如果条目无效,则想防止条目存储在数据库中.在这种情况下,我想检查模块年份是否大于课程中的年份.

这是我的过程(此过程在插入之前执行).

SELECT num_of_years INTO @num_years FROM courses WHERE courses.course_ID = NEW.course_ID;IF NEW.course_year > @num_years THENUPDATE `Error: invalID_ID_test` SET x=1;END;

为什么这允许任何课程年份入学,我该如何解决?最佳答案编辑:修改后的答案,现在我更好地理解了问题.

这是一个测试.

create table courses (  course_ID int primary key,num_of_years tinyint unsigned default 1);create table modules (  module_ID int primary key,course_ID int,course_year tinyint unsigned);delimiter ;;create trigger t before insert on modules for each row begin   declare num_years tinyint unsigned;   select num_of_years into num_years from courses where course_ID = NEW.course_ID;   if NEW.course_year > num_years then     signal sqlstate '45000'       set message_text = 'course_year is larger than the course length';   end if; end;;delimiter ;

这种作品:

insert into courses set course_ID=1,num_of_years=3;insert into modules values set module_ID=1,course_ID1,course_year=4;ERROR 1644 (45000): course_year is larger than the course length

但是,如果courses.num_of_years为NulL,则不会阻止INSERT.

insert into courses set course_ID=2,num_of_years=NulL;insert into modules set module_ID=2,course_ID=2,course_year=99;query OK,1 row affected (0.01 sec)

原因是触发器中的变量为NulL,因此NEW.course_year> num_years不正确,不会引发异常.

要解决此问题,请检查NulL.

delimiter ;;create trigger t before insert on modules for each row begin   declare num_years tinyint unsigned;   select num_of_years into num_years from courses where course_ID = NEW.course_ID;   if num_years is NulL or NEW.course_year > num_years then     signal sqlstate '45000'       set message_text = 'course_year is larger than the course length';   end if; end;;delimiter ;insert into modules set module_ID=2,course_year=99;ERROR 1644 (45000): course_year is larger than the course length

如果您尝试为找不到的course_ID插入模块,这也会引发错误.同样,这将使num_years为NulL,因此我们需要在触发器中进行检查.

insert into modules set module_ID=2,course_ID=5,course_year=99;ERROR 1644 (45000): course_year is larger than the course length
总结

以上是内存溢出为你收集整理的MySQL触发器未正确检查变量 全部内容,希望文章能够帮你解决MySQL触发器未正确检查变量 所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1165965.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存