微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MySQL:如何制作一个拒绝未成年员工的触发器?

如何解决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 举报,一经查实,本站将立刻删除。