Saya ingin mencipta pencetus yang mengesahkan beberapa data sebelum memasukkan baris ke dalam jadual. Saya mempunyai tiga meja:
Kakitangan meja:
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`))
Pengguna jadual:
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
dan anotasi jadual:
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
Jadi hanya pengguna milik orang yang boleh memasukkan komen, jadi saya cuba melaksanakan pencetus seterusnya:
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
Ideanya adalah untuk mendapatkan id Peronnel dari jadual pengguna dan jika ia kosong maka jangan masukkan apa-apa ke dalam jadual tetapi saya tidak dapat membuatnya berfungsi
Anda sudah pun berada dalam picu yang dimasukkan pada Notas, jadi jika tiada sebab untuk membatalkannya, biarkan sahaja ia berlalu.
Ia juga boleh menggunakan
IS NULL
或IS NOT NULL
。不要使用=
或!=
,因为 NULL 不是等于或不等于任何值的值。 IE。NULL = NULL
secara tidak betul apabila membandingkan sesuatu dengan NULL.