2013-03-21 99 views
0

您好我正在使用MySQLTRIGGERS,我正在使用MySQL 5.5.8,我有一个表。因为MySQL不允许CHECK约束,我用一个TRIGGER来检查输入值是否是错误的,如果输入值是错误的,我试着给出一条消息并停止向表中插入记录。但它会忽略我的TRIGGER,如果它包含无效数据,则向表中插入记录。使用触发器来停止插入不工作的表MySQL

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 ; 

我要检查是否为出生日期输入的值小于4个字符,那么不插入记录,给出一个错误信息,但。

enter image description here

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

是什么原因,我这样做是错误的,请帮助,在此先感谢。

UPDATE

enter image description here

+1

插入语句确实表示警告,您是否尝试过“显示警告”? – 2013-03-21 04:48:39

+1

在创建'trigger'的时候,我想你错过了错误的分号如果检查。 – Ranjith 2013-03-21 04:50:00

+0

@ranjith,请告诉我如何做到这一点 – 2013-03-21 04:51:56

回答

3

你触发认定中是错误的。您正在使用日期数据类型,并且正在检查字符长度。这可能是错误的,因为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$$ 

试试这个..

+0

:(它即使添加成功,即使我给予0000-00-00到DateOfBirth – 2013-03-21 06:07:18

+0

你检查触发器定义...在数据库中吗?我也使用这个约束在我的数据库,它的作用像魅力 – alwaysLearn 2013-03-21 06:09:50

+0

我该如何检查??? – 2013-03-21 06:12:32