2013-02-22 75 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