#mysql #mysql-workbench #mysql-error-1064
#mysql #mysql-workbench #mysql-ошибка-1064
Вопрос:
Я хочу добавить два триггера в свою базу данных 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}
Вот определения таблиц:
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');
Комментарии:
1. Черт возьми, я думаю, что уровень представления - это правильное место для проверки данных.
2. Я не могу воспроизвести вашу проблему, триггеры работают должным образом. Пожалуйста, добавьте определения таблиц и инструкции insert, которые, по вашему мнению, должны генерировать ошибки
3. Спасибо @P. Салмон, я включил информацию
4. Вы знаете, что второй триггер не сработает, если первый обнаружит ошибку? И почему в одной таблице есть 2 триггера? Код работает так, как ожидалось..
5. Проверьте, действительно ли были созданы триггеры (
show triggers like '%Teilnehmer%'
) , и проверьте, была ли строка вставлена или нет.
) = 0 THEN
SIGNAL SQLSTATE '33455'
SET MESSAGE_TEXT = 'Your Phone Number is incorrect';
END IF;
END$
DELIMITER ;
Вот определения таблиц:
И вот запись таблицы, которая должна выдавать ошибку для обоих триггеров (но не выдает):
Комментарии:
1. Черт возьми, я думаю, что уровень представления — это правильное место для проверки данных.
2. Я не могу воспроизвести вашу проблему, триггеры работают должным образом. Пожалуйста, добавьте определения таблиц и инструкции insert, которые, по вашему мнению, должны генерировать ошибки
3. Спасибо @P. Салмон, я включил информацию
4. Вы знаете, что второй триггер не сработает, если первый обнаружит ошибку? И почему в одной таблице есть 2 триггера? Код работает так, как ожидалось..
5. Проверьте, действительно ли были созданы триггеры (
show triggers like '%Teilnehmer%'
) , и проверьте, была ли строка вставлена или нет.