如何解决MySQL:如何制作一个拒绝未成年员工的触发器?
我想创建一个拒绝插入未成年员工的触发器,未成年人的意思是他的出生年份是 2004 年或以上。 我编写了以下代码,它运行时没有错误,但它不允许我插入任何员工,因为它说: 错误:“字段列表”中的未知列“出生日期”
当我放下扳机时,一切正常。
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react"></div>
解决方法
您应该测试 NEW.BIRTHDATE
'在触发器主体中,OLD 和 NEW 关键字使您能够访问受触发器影响的行中的列。' https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html
,如果您运行的是 MySQL 8.0,我建议您使用检查约束而不是触发逻辑。
alter table employee
add constraint chk_birthdate
check(year(birthdate) > 2003)
;
这会强制执行与触发器相同的检查,但语法要短得多,并且逻辑直接捆绑在表的定义中(因此在某种程度上更易于维护)。尝试插入违规行时,您会收到以下错误消息:
Check constraint 'chk_birthdate' is violated.
,
我必须建议您对触发器进行 2 处更改:
- @P.Salmon 回答说你应该使用
NEW.BIRTHDATE
参数 - 相比之下,第二次使用年龄而不是出生年份
DELIMITER $$
CREATE TRIGGER REJECT_EMP
BEFORE INSERT ON EMPLOYEE
FOR EACH ROW
BEGIN
IF TIMESTAMPDIFF(YEAR,NEW.BIRTHDATE,NOW()) < 17 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'An error occurred';
END IF;
END$$
DELIMITER ;
,
一般来说,每天检查 year()
的正确方法是。所以你想要的逻辑是:
BEGIN
IF BIRTHDATE > CURDATE() - INTERVAL 16 YEAR THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'An error occurred';
END IF;
END$$
这实际上会检查出生日期。因此,某人可以在生日那天成为员工。
我不确定“16”是正确的值,但您的问题并没有解释它。鉴于您提出的逻辑以及您提出问题的年份是 2020 年,这是有道理的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。