MySQL INSERT前校验数据的触发器



我想创建一个触发器,在将一行插入表之前验证一些数据。我有三个表:

表人员:

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

这个想法是从用户表中获得人员id,如果它是空的,不要插入任何东西到表中,但我不能使它工作

您已经在Notas上插入的触发器中,所以如果没有理由取消它,就让它通过。

也可以使用IS NULLIS NOT NULL来比较NULL。不要使用=!=,因为NULL不是等于或不等于任何东西的值。即NULL = NULL不为真。

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 IS NULL) THEN
SIGNAL SQLSTATE '50001' SET MESSAGE_TEXT = 'Las notas sólo pueden ser registradas por usuarios internos';
END IF;
END

最新更新