mysql - 尽管语法应该是正确的,但为什么这些触发器没有检测到错误的数据?
问题描述
我想在我的 mysql 数据库中添加两个触发器,但似乎两个触发器都不起作用(尽管 mysql 编译器接受语法)。当我插入应该被触发器检测为错误的新数据行时,我没有收到错误消息。你知道错误可能是什么吗?
下面是触发器的代码:
USE `mydb`$$
DROP TRIGGER IF EXISTS `mydb`.`Teilnehmer_BEFORE_INSERT` $$
USE `mydb`$$
CREATE DEFINER = CURRENT_USER TRIGGER `mydb`.`Teilnehmer_BEFORE_INSERT` BEFORE INSERT ON `Teilnehmer` FOR EACH ROW
BEGIN
IF (DATEDIFF(CURRENT_DATE(),NEW.Geburtsdatum) < 6570) THEN
-- Throw Exception
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Age is less than 18 years!';
END IF; -- A semicolon (delimiter) is missing here
END
$$
DELIMITER ;
DELIMITER $$
CREATE TRIGGER `enforce_phone_check` BEFORE INSERT ON `Teilnehmer` FOR EACH ROW
BEGIN
IF (NEW.Telefonnummer REGEXP '^(\\+?[0-9]{1,4}-)?[0-9]{3,10}$' ) = 0 THEN
SIGNAL SQLSTATE '33455'
SET MESSAGE_TEXT = 'Your Phone Number is incorrect';
END IF;
END$$
DELIMITER ;
以下是表定义:
CREATE TABLE IF NOT EXISTS `mydb`.`Preis` (
`idPreis` INT NOT NULL,
`Menge` VARCHAR(45) NULL,
`Wert` INT NULL,
`Art` VARCHAR(45) NULL,
PRIMARY KEY (`idPreis`))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`Teilnehmer` (
`idTeilnehmer` INT NOT NULL,
`email` VARCHAR(45) NULL,
`Preis_idPreis` INT NOT NULL,
`Vorname` VARCHAR(45) NULL,
`Nachname` VARCHAR(45) NULL,
`Strasse` VARCHAR(45) NULL,
`Hausnr.` VARCHAR(45) NULL,
`PLZ` INT(4) NULL,
`Ort` VARCHAR(64) NULL,
`Geburtsdatum` DATE NULL,
`Telefonnummer` VARCHAR(16) NULL,
`Bild_URL TEXT` TEXT(500) NULL,
`ts` timestamp,
PRIMARY KEY (`idTeilnehmer`, `Preis_idPreis`),
INDEX `fk_Teilnehmer_Preis1_idx` (`Preis_idPreis` ASC) VISIBLE,
CONSTRAINT `fk_Teilnehmer_Preis1`
FOREIGN KEY (`Preis_idPreis`)
REFERENCES `mydb`.`Preis` (`idPreis`),
UNIQUE Key `idTeilnehmer`(`idTeilnehmer`, `Nachname`))
ENGINE = InnoDB;
这是一个应该为两个触发器引发错误的表条目(但不会):
INSERT INTO `mydb`.`teilnehmer` (`idTeilnehmer`, `email`, `Preis_idPreis`, `Vorname`, `Nachname`, `Strasse`, `Hausnr.`, `PLZ`, `Ort`, `Geburtsdatum`, `Telefonnummer`, `Bild_URL TEXT`, `ts`) VALUES ('1', 'sdfsdf', '1', 'sdfsd', 'sdfsd', 'sdfsdf', '17', '9230', 'Flawil', '2005-06-06', '2342345', 'stsdfsdf', '2019-06-06');
解决方案
推荐阅读
- servicestack - 将参数传递给 ExecuteSql()
- javascript - 使用 POST 在 Laravel 刀片中使用 Ajax 的内部服务器错误 500
- android - Android中单击错误的按钮
- sql - 为什么加入需要花费大量时间来执行?
- spring - Spring social OAuth2 'state' 参数丢失或不匹配
- python - 在维基百科语料库上训练 LDA 来标记任意文章?
- node.js - MongoDB 节点驱动程序:如何从节点运行加载命令?
- r - 格图 | 图例未填写
- python - 关于 sqlalchemy 中的 unique=True 和 (unique=True, index=True)
- java - 在 Spring 4 + MVC 中不能在 Thymeleaf 上使用片段