Определение триггера MySQL - ошибка 1064 - PullRequest
1 голос
/ 28 января 2012

Мой предложенный триггер:

#START TRIGGER
delimiter //
DECLARE msg VARCHAR(255);
CREATE TRIGGER passStandard_check BEFORE INSERT ON Module
FOR EACH ROW 
BEGIN 
IF NEW.passStandard < 0 || NEW.passStandard > 1 THEN 
set msg = concat('Trigger Error: Pass Standard: ', cast(NEW.passStandard as char));
signal sqlstate '45000' set message_text = msg;
END
//
delimiter ;
#END TRIGGER

Но я получаю следующую ошибку:

Код ошибки: 1064. У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'DECLARE msg VARCHAR (255); CREATE TRIGGER passStandard_check ПЕРЕД ВСТАВКОЙ ВКЛ. Mod 'в строке 1

Добавление в END IF не имеет никакого значения.

passStandard установлен на INT NOT NULL.


Редактировать

Я переместил оператор DECLARE после BEGIN:

#START TRIGGER
delimiter //
CREATE TRIGGER passStandard_check BEFORE INSERT ON Module
FOR EACH ROW 
BEGIN 
DECLARE msg VARCHAR(255);
IF NEW.passStandard < 0 || NEW.passStandard > 1 THEN 
set msg = concat('Trigger Error: Pass Standard: ', cast(NEW.passStandard as char));
signal sqlstate '45000' set message_text = msg;
END IF;
END
//
delimiter ;
#END TRIGGER

Но я все еще получаю эту ошибку:

Код ошибки: 1064. У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса, чтобы использовать около 'sqlstate' 45000 'set message_text = msg; END IF; END 'в строке 7

Ответы [ 5 ]

2 голосов
/ 28 января 2012

Вам необходимо объявить вашу переменную "msg" внутри вашей процедуры и использовать END IF

#START TRIGGER
delimiter //
CREATE TRIGGER passStandard_check BEFORE INSERT ON Module
FOR EACH ROW 
BEGIN 
    DECLARE msg VARCHAR(255); /* << PUT THIS HERE */
    IF NEW.passStandard < 0 || NEW.passStandard > 1 THEN 
        set msg = concat('Trigger Error: Pass Standard: ', cast(NEW.passStandard as char));
        signal sqlstate '45000' set message_text = msg;
    END IF; /* << YOU WILL NEED THIS TOO (DONT FORGET THE SEMICOLON :D) */
END//
delimiter ;
#END TRIGGER
1 голос
/ 11 июля 2012

Я заметил, что я получаю предупреждения MySQL при добавлении триггеров с логикой IF / ELSE, если я не добавляю скобки в операторы IF. Не знаю почему, но я добавил скобки, и предупреждения исчезли. Попробуйте что-то вроде:

IF ((NEW.passStandard < 0) || (NEW.passStandard > 1)) THEN 
    set msg = concat('Trigger Error: Pass Standard: ', cast(NEW.passStandard as char));
    signal sqlstate '45000' set message_text = msg;
END IF;
0 голосов
/ 19 марта 2016

у меня получилось. Пожалуйста, найдите ниже рабочий код.

delimiter //
CREATE TRIGGER test_check1 BEFORE INSERT ON employee 
FOR EACH ROW 
BEGIN
DECLARE msg VARCHAR(255); 
IF (NEW.sync_id = '0') THEN 
SET NEW.name = 'Collect Money'; 
signal sqlstate '45000' set message_text = msg; 
END IF; 
END//
delimiter ;
0 голосов
/ 28 января 2012

Может быть так:

DECLARE разрешено только внутри составного оператора BEGIN ... END и должно быть в его начале перед любыми другими операторами.

http://dev.mysql.com/doc/refman/5.0/en/declare.html

0 голосов
/ 28 января 2012

Попробуйте разбить его на несколько запросов.Или запустите его в phpmyadmin, который обрабатывает несколько запросов, разделенных точкой с запятой.

...