Rumah > Soal Jawab > teks badan
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
P粉5508235772024-03-30 00:58:23
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.
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