gpt4 book ai didi

mysql - SIGNAL SQLSTATE '45000' 不停止插入

转载 作者:行者123 更新时间:2023-12-05 05:06:40 27 4
gpt4 key购买 nike

我在我的表中实现触发器时遇到问题。我正在使用 MySQL,Phpmyadmin

场景:表User(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

感谢任何帮助

最佳答案

我会稍微改变触发器:

  • 使用 session 变量(因此不需要声明)
  • 将比较逻辑放在 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

关于mysql - SIGNAL SQLSTATE '45000' 不停止插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59739854/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com