2013-04-16 2 views
1

아래에 설명 된대로 테이블이 있고 BEFORE INSERT 트리거를 사용하여 열 값을 세션 정의 변수로 업데이트합니다. INSERT 세트는 modified_by_user 및 created_by_user 열을 모두 예상대로 1로 설정합니다. 그러나 UPDATE는 modified_by_user를 예상대로 2로 변경하지 않지만 1로 유지합니다. BEFORE UPDATE ON을 사용하여 열 값을 업데이트하는 방법은 무엇입니까? 나는 MySQL 5.5를 사용하고있다. 조회가 지정된 열 값을 지정하지 않을 경우 감사BEFORE UPDATE ON을 사용하여 열 값 업데이트

대해 UPDATE에
SET @users_id=1; 
INSERT INTO notes(notes,record_status_id,date_created) VALUES("hello","active",NOW()); 
//modified_by_user=1, created_by_user=1, notes="hello" 

SET @users_id=2; 
UPDATE notes SET notes="goodby" WHERE id=1; 
//modified_by_user=1, created_by_user=1, notes="goodby" 

CREATE TABLE IF NOT EXISTS `notes` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT , 
    `notes` TEXT NULL , 
    `record_status_id` VARCHAR(8) NOT NULL , 
    `date_created` DATETIME NOT NULL , 
    `date_modified` TIMESTAMP NOT NULL , 
    `modified_by_user` INT UNSIGNED NULL , 
    `created_by_user` INT UNSIGNED NULL , 
    PRIMARY KEY (`id`) , 
    INDEX `fk_notes_users1_idx` (`modified_by_user` ASC) , 
    INDEX `fk_notes_users2_idx` (`created_by_user` ASC) , 
    INDEX `fk_notes_record_status1_idx` (`record_status_id` ASC) , 
    CONSTRAINT `fk_notes_users10` 
    FOREIGN KEY (`modified_by_user`) 
    REFERENCES `users` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_notes_users20` 
    FOREIGN KEY (`created_by_user`) 
    REFERENCES `users` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_notes_record_status1` 
    FOREIGN KEY (`record_status_id`) 
    REFERENCES `record_status` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

DELIMITER $$ 


CREATE TRIGGER tg_notes_ins BEFORE INSERT ON notes FOR EACH ROW 
BEGIN 
    IF NEW.created_by_user IS NULL OR NEW.created_by_user = '' THEN 
     SET NEW.created_by_user = @users_id; 
     SET NEW.modified_by_user = @users_id; 
    END IF; 
END$$ 



CREATE TRIGGER tg_notes_upd BEFORE UPDATE ON notes FOR EACH ROW 
BEGIN 
    IF NEW.modified_by_user IS NULL OR NEW.modified_by_user = '' THEN 
     SET NEW.modified_by_user = @users_id; 
    END IF; 
END$$ 


DELIMITER ; 
+0

NEW 별칭을 사용하려면 AFTER UPDATE 트리거가 필요하다고 생각합니다. – SomeSillyName

+0

@SomeSillyName. AFTER UPDATE를 사용하면 트리거에서 UPDATE가 필요하지 않으며 다른 트리거를 트리거하지 않습니까? 또한, 그것은 BEFORE를 사용하여 INSERT와 함께 작동하며, 나는 그들이 유사하다고 생각할 것입니다. – user1032531

+0

당신 말이 맞아요. 그것은 BEFORE UPDATE 여야합니다. 그러나 삽입이 modified_by_user 값을 설정하는 경우, BEFORE UPDATE 트리거에서 테스트중인 NULL 또는 ''이 될 수 없습니다. – SomeSillyName

답변

1

이 NEW.column 내가 원래 예상대로 NULL 아니라, 그 열의 값이 변화되어서는 안된다 (즉, 이전 OLD.column 값)

관련 문제