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 ;
我想你想要一個AFTER UPDATE觸發器來使用NEW別名。 – SomeSillyName
@SomeSillyName。如果我使用AFTER UPDATE,我不需要觸發器中的更新,它會不會觸發另一個觸發器?另外,它使用BEFORE與INSERT一起工作,我認爲它們會相似。 – user1032531
你說得對。它應該在更新之前。但是,如果insert設置了modified_by_user值,它將永遠不會是NULL,或者在BEFORE UPDATE觸發器中測試它。 – SomeSillyName