2013-04-16 59 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來更新列值

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

我想你想要一個AFTER UPDATE觸發器來使用NEW別名。 – SomeSillyName

+0

@SomeSillyName。如果我使用AFTER UPDATE,我不需要觸發器中的更新,它會不會觸發另一個觸發器?另外,它使用BEFORE與INSERT一起工作,我認爲它們會相似。 – user1032531

+0

你說得對。它應該在更新之前。但是,如果insert設置了modified_by_user值,它將永遠不會是NULL,或者在BEFORE UPDATE觸發器中測試它。 – SomeSillyName

回答

1

上安裝更新,如果查詢不給定列指定值NEW.column不是NULL作爲我最初的預期,但是列的值應該也不會被改變(即以前的OLD.column值)

相關問題