Ошибка триггера Mysql : SQLSTATE[42000]: Синтаксическая ошибка или нарушение доступа: 1231 Переменная «MESSAGE_TEXT» не может быть установлена в значение «NULL»

#mysql #triggers

Вопрос:

Я пытаюсь добавить некоторые триггеры в свою базу данных и получаю эту ошибку : SQLSTATE[42000]: Синтаксическая ошибка или нарушение доступа: 1231 Переменная «MESSAGE_TEXT» не может быть установлена в значение «NULL»

Версия MySQL : 8.0.26

Вот пример триггера перед обновлением:

 CREATE 
DEFINER = 'admin'@'%'
TRIGGER db2.members_b_u
    BEFORE UPDATE
    ON db2.mymembers
    FOR EACH ROW
begin
    declare msg VARCHAR(200);
    DECLARE userid1 INT;
    if new.memberid IS null then
        set msg = CONCAT('Error .: ', cast(new.userid as char));
        SIGNAL sqlstate '45000' set message_text = msg;
   end if;
    if new.memberlevel <>'Π19' AND new.memberlevel <>'ΜΜ' AND new.memberlevel is not null AND new.city IS NULL then
        set msg = CONCAT('Error : ', cast(new.am as char));
        SIGNAL sqlstate '45000' set message_text = msg;
   end if;
    if LENGTH(new.postalcode1)<>5 AND new.city1 between '01' and '99' then
        set msg = CONCAT('Error : ', cast(new.userid as char));
        SIGNAL sqlstate '45000' set message_text = msg;
   end if;
   select userid into userid1 from mymembers where memberid=new.memberid AND userid!=NEW.userid;
        set msg = CONCAT('Error : ', cast(userid1 as char));
        SIGNAL sqlstate '45000' set message_text = msg;
END
 

Любая помощь будет признательна !

Ответ №1:

concat возвращает null , если есть какие-либо из его аргументов null , что вполне может произойти здесь. Одним из способов защиты от этого было бы использование coalesce . Например.:

 set msg = CONCAT('Error .: ', COALESCE(cast(new.userid as char), 'Missing userid');