СИГНАЛ SQLSTATE '45000' не останавливает вставку - PullRequest
2 голосов
/ 14 января 2020

У меня проблемы с внедрением триггера в мою таблицу. Я использую MySQL, Phpmyadmin

Сценарий: пользователь таблицы (user_id, имя, фамилия, date_of_joining), запись (record_id, date_of_record, вес, рост, id_user)

пользователь может иметь несколько записей, которые показывают его вес и рост на определенную дату. id_user - это внешний ключ, ссылающийся на user_id.

Я пытаюсь реализовать триггер для вставки и обновления, который проверяет, больше ли date_of_record, чем date_of_joining, если нет, вставка должна быть остановлена.

Это триггер, который я пробовал, и вставка все еще проходит через

CREATE TRIGGER date_check_insert BEFORE INSERT ON record

FOR EACH ROW

BEGIN

    DECLARE date_of_registering DATE;

    SET date_of_registering = (SELECT date_of_registering FROM user WHERE user_id = new.id_user);

    IF (new.date_of_record NOT BETWEEN date_of_registering AND CURDATE()) THEN

        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "Can not insert that value";

    END IF;

END

Любая помощь приветствуется

1 Ответ

0 голосов
/ 15 января 2020

Я бы немного изменил триггер:

  • Использовать переменную сеанса (поэтому DECLARE не требуется)
  • Поместите логи сравнения c в одном месте в предложении WHERE ( легче читать и понимать)
  • Показывает причину в сообщении об ошибке
  • Использовать SELECT INTO переменную вместо SET variable = query (не обязательно, я просто предпочитаю этот способ)

Итак:

CREATE TRIGGER date_check_insert BEFORE INSERT ON record
FOR EACH ROW
BEGIN
    SET @found = NULL;

    SELECT
        user_id INTO @found
    FROM
        user
    WHERE
            user_id = NEW.id_user
        AND NEW.date_of_record BETWEEN date_of_registering AND NOW() -- or CURDATE() depend on your datetype
    ;

    IF @found IS NULL THEN
        SET @msg = CONCAT('Can not insert. Out of range value ', NEW.date_of_record);
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = @msg;
    END IF;
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...