SIGNAL SQLSTATE '45000' 不停止插入

SIGNAL SQLSTATE '45000' Doesn't stop Insert

我在 table 中实施触发器时遇到问题。我正在使用 MySQL、Phpmyadmin

场景:Table 用户(user_id, name, surname, date_of_joining), record(record_id, date_of_record, weight, height, id_user)

一个用户可以有多个记录显示他在特定日期的体重和身高。 id_user 是引用 user_id 的外键。

我正在尝试实现插入和更新触发器,它检查 date_of_record 是否大于 date_of_joining,如果不是,则应停止插入。

这是我试过的触发器,插入仍然通过

CREATE TRIGGER date_check_insert BEFORE INSERT ON record

FOR EACH ROW

BEGIN

    DECLARE date_of_registering DATE;

    SET date_of_registering = (SELECT date_of_registering FROM user WHERE user_id = new.id_user);

    IF (new.date_of_record NOT BETWEEN date_of_registering AND CURDATE()) THEN

        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "Can not insert that value";

    END IF;

END

感谢任何帮助

我会稍微改变触发器:

  • 使用会话变量(因此不需要 DECLARE)
  • 将比较逻辑放在 WHERE 子句中的一个位置(更易于阅读和理解)
  • 在错误消息中显示原因
  • SELECT INTO variable代替SET variable = query(没必要,我只是喜欢这样)

所以:

CREATE TRIGGER date_check_insert BEFORE INSERT ON record
FOR EACH ROW
BEGIN
    SET @found = NULL;

    SELECT
        user_id INTO @found
    FROM
        user
    WHERE
            user_id = NEW.id_user
        AND NEW.date_of_record BETWEEN date_of_registering AND NOW() -- or CURDATE() depend on your datetype
    ;

    IF @found IS NULL THEN
        SET @msg = CONCAT('Can not insert. Out of range value ', NEW.date_of_record);
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = @msg;
    END IF;
END