0

嗨,我正在使用MySQL TRIGGERS,我正在使用MySQL 5.5.8,我有一张桌子。由于MySQL不允许CHECK约束,我使用 aTRIGGER检查输入值是否错误,如果输入值错误,我尝试给出消息并停止将记录插入表中。但TRIGGER如果它包含无效数据,它会忽略我的记录插入到表中。

桌子

CREATE TABLE pupil_data
(
PupilID int(10) NOT NULL  AUTO_INCREMENT,
PupilForeName varchar(255) NOT NULL,
PupilLastName varchar(255) NOT NULL,
Gender CHAR(1),
DateOfBirth  DATE ,
PhoneNumber int(10) ,
FamilyID int(10) NOT NULL,
PRIMARY KEY (PupilID),
FOREIGN KEY (FamilyID) REFERENCES family_data(FamilyID)  
ON DELETE CASCADE
ON UPDATE CASCADE
,
UNIQUE (PhoneNumber)
) ENGINE=innodb;

扳机

DELIMITER $$
CREATE TRIGGER `check_pupil_before_insert` BEFORE INSERT ON `pupil_data`
FOR EACH ROW  BEGIN
  IF  CHAR_LENGTH( NEW.DateOfBirth ) < 4 THEN
       SIGNAL SQLSTATE '12345'
        SET MESSAGE_TEXT := 'check constraint on pupil_data.DateOfBirth  failed'
    END IF;
END$$  
DELIMITER ;

我想检查为 DateOfBirth 输入的值是否小于 4 个字符,然后不要插入记录,但会给出错误消息。

在此处输入图像描述

的值DateOfBirth0,所以我想它应该给出一个错误,但你可以看到它正在执行忽略它。

是什么原因,我做错了,请帮助,提前谢谢。

更新

在此处输入图像描述

4

1 回答 1

3

您的触发器定义是错误的。您正在使用 date 数据类型,为此您正在检查 char length 。这可能是错误的,因为mysql默认输入日期为'0000-00-00'加上你的语法是错误的......

所以你的触发器定义应该是

 CREATE TRIGGER `check_pupil_before_insert` BEFORE INSERT ON `pupil_data`
FOR EACH ROW  BEGIN
 IF   NEW.DateOfBirth = '0000-00-00' THEN
   SIGNAL SQLSTATE '12345'
    SET MESSAGE_TEXT = 'check constraint on pupil_data.DateOfBirth  failed';
 END IF;
END$$  

试试这个 ..

于 2013-03-21T06:01:52.080 回答