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
我在 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