2013-03-21 58 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