2013-02-22 77 views
0

我有以下两个表格和一个触发器,当一个记录插入User表格并在StudentID中带有一个非空值时,这个触发器应该将一条记录插入到Student表格中。 MySQL在触发器上报告没有语法错误,并且按照预期插入到用户表中,但不触发插入到Student表中。
我曾尝试使用BEFORE和AFTER INSERT之后无效。我正在使用phpMyAdmin版本3.5.2.2。任何帮助将不胜感激。插入触发器不工作后的MySQL

DROP TABLE IF EXISTS `User` ; 

CREATE TABLE IF NOT EXISTS `User` (
    `UserID` INT NOT NULL AUTO_INCREMENT , 
    `FirstName` VARCHAR(45) NOT NULL , 
    `LastName` VARCHAR(45) NOT NULL , 
    `eMail` VARCHAR(60) NOT NULL , 
    `StudentID` INT NULL , 
    KEY ix_User_StudentID (StudentID), 
    PRIMARY KEY (`UserID`) 
) 
ENGINE = InnoDB; 

DROP TABLE IF EXISTS `Student` ; 

CREATE TABLE IF NOT EXISTS `Student` (
    `StudentID` INT NOT NULL , 
    `UserID` INT NOT NULL , 
    PRIMARY KEY (`StudentID`) , 
    CONSTRAINT `fk_Student_User1` 
    FOREIGN KEY (`StudentID`) 
    REFERENCES `User` (`StudentID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT `fk_Student_User2` 
    FOREIGN KEY (`UserID`) 
    REFERENCES `User` (`UserID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE 
) 
ENGINE = InnoDB; 

DROP TRIGGER IF EXISTS after_insert_user; 

DELIMITER // 
CREATE TRIGGER after_insert_user 
AFTER INSERT ON `User` 
FOR EACH ROW BEGIN 
    IF (NEW.StudentID <> NULL) THEN 
     INSERT INTO Student VALUES (NEW.StudentID, NEW.UserID); 
    END IF; 
END; 
// 

DELIMITER ; 
+0

你不能使用AFTER INSERT后,您必须使用BEFORE INSERT – Winston 2013-02-22 23:22:06

+0

@Win斯通我尝试过之前插入没有成功。与AFTER INSERT相比,在使用BEFORE INSERT时是否需要对触发器进行任何其他语法更改? – Aprish 2013-02-22 23:35:39

回答

2

确实需要是AFTER触发器,但

IF (NEW.StudentID <> NULL) THEN 

不会给你想要的东西。它将始终返回false。相反,使用:

IF (NEW.StudentID IS NOT NULL) THEN 

或更隐秘:

IF (NOT IFNULL(NEW.StudentID)) THEN 

或更深奥:

IF (NOT NEW.StudentID <=> NULL) THEN 

这是它在行动:

[email protected]:~$ mysql -vvv < 15034839.sql 
-------------- 
DROP TABLE IF EXISTS `Student` 
-------------- 

Query OK, 0 rows affected (0.00 sec) 

-------------- 
DROP TABLE IF EXISTS `User` 
-------------- 

Query OK, 0 rows affected (0.01 sec) 

-------------- 
CREATE TABLE IF NOT EXISTS `User` (
    `UserID` INT NOT NULL AUTO_INCREMENT , 
    `FirstName` VARCHAR(45) NOT NULL , 
    `LastName` VARCHAR(45) NOT NULL , 
    `eMail` VARCHAR(60) NOT NULL , 
    `StudentID` INT NULL , 
    KEY ix_User_StudentID (StudentID), 
    PRIMARY KEY (`UserID`) 
) 
ENGINE = InnoDB 
-------------- 

Query OK, 0 rows affected (0.00 sec) 

-------------- 
CREATE TABLE IF NOT EXISTS `Student` (
    `StudentID` INT NOT NULL , 
    `UserID` INT NOT NULL , 
    PRIMARY KEY (`StudentID`) , 
    CONSTRAINT `fk_Student_User1` 
    FOREIGN KEY (`StudentID`) 
    REFERENCES `User` (`StudentID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT `fk_Student_User2` 
    FOREIGN KEY (`UserID`) 
    REFERENCES `User` (`UserID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE 
) 
ENGINE = InnoDB 
-------------- 

Query OK, 0 rows affected (0.00 sec) 

-------------- 
DROP TRIGGER IF EXISTS after_insert_user 
-------------- 

Query OK, 0 rows affected, 1 warning (0.00 sec) 

-------------- 
CREATE TRIGGER after_insert_user 
AFTER INSERT ON `User` 
FOR EACH ROW BEGIN 
    IF (NEW.StudentID IS NOT NULL) THEN 
     INSERT INTO Student VALUES (NEW.StudentID, NEW.UserID); 
    END IF; 
END; 
-------------- 

Query OK, 0 rows affected (0.00 sec) 

-------------- 
INSERT INTO User VALUES (NULL, 'first', 'last', 'email', 123) 
-------------- 

Query OK, 1 row affected (0.01 sec) 

-------------- 
SELECT * FROM Student 
-------------- 

+-----------+--------+ 
| StudentID | UserID | 
+-----------+--------+ 
|  123 |  1 | 
+-----------+--------+ 
1 row in set (0.00 sec) 

Bye 
[email protected]:~$ 
+0

谢谢!这解决了它。 – Aprish 2013-02-23 00:02:16

+0

令人惊叹......我不知道深奥和神秘的方式......谢谢xD – Hackerman 2013-02-23 00:59:45