MySQL触发器 - 如果超出属性范围(int)则不要更新

时间:2015-11-18 10:56:47

标签: mysql triggers

我试图创造(我认为)应该是一个基本触发器。

基本上如果有人试图为触发范围之外的记录设置一个值,那么它将拒绝更新。

表名为:人

相关领域是:年龄(国际)

     CREATE TRIGGER max_age_trigger BEFORE UPDATE
     ON People
     FOR EACH ROW
     BEGIN
         IF People.age <0 OR People.age>150 THEN
           SIGNAL SQLSTATE '45000'
               SET MESSAGE_TEXT = `Error: The age is out of range (0 > 150)`;
        END IF;
      END

MySQL在第7行引发了错误。但是,我并不了解我出错的地方。我是触手可及者的新手,但我仍然不知所措。

#1064 - 您的SQL语法出错;查看与您的MySQL服务器版本相对应的手册,以获得在&#39;&#39;附近使用的正确语法。第7行

如果您可以帮助/协助我使用我的代码,那将会有很大的帮助:)

1 个答案:

答案 0 :(得分:0)

  

13.1.16 CREATE TRIGGER Syntax

     

...

     

在触发器主体中,您可以引用主题表中的列   (与触发器关联的表)使用别名OLD和   新。 OLD.col_name引用现有行的列   更新或删除。 NEW.col_name引用新行的列   插入或更新后的现有行。

     

...

同样改变:

-- SET MESSAGE_TEXT = `Error: The age is out of range (0 > 150)`;
SET MESSAGE_TEXT = 'Error: The age is out of range (0 > 150)';

尝试:

DELIMITER //

DROP PROCEDURE IF EXISTS `sp_test`//
DROP TABLE IF EXISTS `People`//

CREATE TABLE `People` (
  `age` INT
)//

INSERT INTO `People`
  (`age`)
VALUES
  (20)//

CREATE TRIGGER `max_age_trigger` BEFORE UPDATE ON `People`
FOR EACH ROW
BEGIN
  -- IF People.age <0 OR People.age>150 THEN
  IF NEW.`age` < 0 OR NEW.`age` > 150 THEN
    SIGNAL SQLSTATE '45000'
    -- SET MESSAGE_TEXT = `Error: The age is out of range (0 > 150)`;
    SET MESSAGE_TEXT = 'Error: The age is out of range (0 > 150)';
  END IF;
END//

CREATE PROCEDURE `sp_test`(`p_age` INT)
BEGIN
  UPDATE `People` SET `age` = `p_age`;
END//

DELIMITER ;

测试:

mysql> CALL `sp_test`(200);
ERROR 1644 (45000): Error: The age is out of range (0 > 150)

建议,对于AGE,也许INT数据类型非常大,尝试更好的维度。请参阅Chapter 11 Data Types