我想建立一個觸發器,在將行插入表中之前驗證一些資料。我有三張桌子:
餐桌人員:
CREATE TABLE IF NOT EXISTS `mydb`.`Personal` ( `IdPersonal` INT NOT NULL, `ApePaterno` VARCHAR(60) NOT NULL, `ApeMaterno` VARCHAR(60) NULL, `Nombre` VARCHAR(60) NOT NULL, `Direccion` VARCHAR(100) NOT NULL, `FechaDeIngreso` DATE NOT NULL, PRIMARY KEY (`IdPersonal`))
表格使用者:
CREATE TABLE IF NOT EXISTS `mydb`.`Usuarios` ( `idUsuario` INT NOT NULL, `Nombre` VARCHAR(45) NOT NULL, `Contrasenia` VARCHAR(45) NOT NULL, `IdPersonal` INT NULL, PRIMARY KEY (`idUsuario`), INDEX `fk_Usuario_Personal_idx` (`IdPersonal` ASC) VISIBLE, CONSTRAINT `fk_Usuario_Personal` FOREIGN KEY (`IdPersonal`) REFERENCES `mydb`.`Personal` (`IdPersonal`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB
與表格註解:
CREATE TABLE IF NOT EXISTS `mydb`.`Notas` ( `idNota` INT NOT NULL, `Nota` VARCHAR(256) NOT NULL, `IdUsuario` INT NOT NULL, PRIMARY KEY (`idNota`), INDEX `fk_IdUsuario_idx` (`IdUsuario` ASC) VISIBLE, CONSTRAINT `fk_IdUsuario` FOREIGN KEY (`IdUsuario`) REFERENCES `mydb`.`Usuarios` (`idUsuario`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB
因此,只有屬於人員的使用者才能插入註釋,因此我嘗試實作下一個觸發器:
CREATE DEFINER=`root`@`localhost` TRIGGER `Notas_BEFORE_INSERT` BEFORE INSERT ON `Notas` FOR EACH ROW BEGIN DECLARE IdInterno INT; SELECT IdPersonal INTO IdInterno FROM Usuarios WHERE idUsuario = new.IdUsuario; IF (IdInterno != null) THEN INSERT INTO Notas (Nota, IdUsuario) VALUES (new.Nota, new.IdUsuario); ELSE SIGNAL SQLSTATE '50001' SET MESSAGE_TEXT = 'Las notas sólo pueden ser registradas por usuarios internos'; END IF; END
這個想法是從用戶表中獲取 Peronnel id,如果它為空,則不要向表中插入任何內容,但我無法使其工作
您已經處於在 Notas 上插入的觸發器中,因此如果沒有理由取消它,就讓它通過。
在將某些內容與 NULL 進行比較時,也可以使用
IS NULL
或IS NOT NULL
。不要使用=
或!=
,因為 NULL 不是等於或不等於任何值的值。 IE。NULL = NULL
不正確。