我想创建一个触发器,在将行插入表中之前验证一些数据。我有三张桌子:
餐桌人员:
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,如果它为空,则不要向表中插入任何内容,但我无法使其工作
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
您已经处于在 Notas 上插入的触发器中,因此如果没有理由取消它,就让它通过。
在将某些内容与 NULL 进行比较时,还可以使用
IS NULL或IS NOT NULL。不要使用=或!=,因为 NULL 不是等于或不等于任何值的值。 IE。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