반응형
다음 두 테이블과 StudentID에 null이 아닌 값으로 레코드가 User 테이블에 삽입 될 때 Student 테이블에 레코드를 삽입해야하는 트리거가 있습니다. MySQL은 트리거에서 구문 오류를보고하지 않으며 User 테이블에 대한 삽입이 예상대로 작동하지만 Student 테이블에 대한 삽입을 트리거하지 않습니다.
BEFORE 및 AFTER INSERT를 사용하여 아무 효과가 없습니다. phpMyAdmin 버전 3.5.2.2를 사용하고 있습니다. 어떤 도움이라도 대단히 감사하겠습니다.
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 ;
해결 방법
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
실행중인 작업은 다음과 같습니다.
ross@pv1:~$ 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
ross@pv1:~$
참조 페이지 https://stackoverflow.com/questions/15034839
반응형
'MySql' 카테고리의 다른 글
MySQL mysql 명령 줄에서 데이터베이스 복원 (0) | 2021.01.12 |
---|---|
MySQL mysql에서 업데이트 된 행 선택 (0) | 2021.01.12 |
MySQL Java에서 MySQL에 이미지 저장 (0) | 2021.01.11 |
MySQL CodeIgniter에서 query () 및 limit () 메서드를 결합하는 방법 (0) | 2021.01.11 |
MySQL WHERE 절을 사용하는 여러 테이블이있는 MySQL UPDATE 구문 (0) | 2021.01.11 |
댓글