cari

Rumah  >  Soal Jawab  >  teks badan

Pencetus MySQL sebelum mengesahkan data

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粉558478150P粉558478150313 hari yang lalu398

membalas semua(1)saya akan balas

  • P粉550823577

    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 NULLIS 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

    balas
    0
  • Batalbalas