Mysql триггер с конкатенацией в переменной не работает - PullRequest
0 голосов
/ 08 мая 2018

Я сделал триггер в Mysql, но по какой-то причине результат конкатенации всегда равен нулю. Чего мне не хватает?

BEGIN

IF NEW.weight < OLD.weight THEN
SET @description = CONCAT('You lost ', OLD.weight - NEW.weight, ' kgs');
ELSE
SET @description = CONCAT('You gained ', NEW.weight - OLD.weight, ' kgs');
END IF;
INSERT INTO History
VALUES (NEW.user_id, 'weight', @description, null);

END

1 Ответ

0 голосов
/ 08 мая 2018

Непонятно, что вы подразумеваете под "всегда ноль"?

CONCAT должен возвращать строковое значение или NULL.

На основе предоставленного кода результат выражения CONCAT присваивается пользовательской переменной @description.

Мы замечаем, что INSERT не указывает столбцы, в которые нужно вставить. Возможно ли, что вводимые вами значения не совпадают со столбцами в таблице.

Укажите имена столбцов в порядке, соответствующем порядку предоставленных значений

INSERT INTO History (col3, col1, col4, col2)
VALUES (NEW.user_id, 'weight', @description, null)

И убедитесь, что столбец, в который мы вставляем строковое значение, имеет тип символа, а не числовой (MySQL будет молча выполнять неявное преобразование строк в числовые, ... в качестве простой демонстрации поведения рассмотрим:

SELECT 'foo' + 0     AS c1
     , '123abc' + 0  AS c2

Если это не проблема, тогда ...

Если вы имели в виду, что результат NEW.weight - OLD.weight оценивается как ноль, это произойдет, когда значения NEW. и OLD. weight равны.

Если weight может быть НЕДЕЙСТВИТЕЛЕН, рассмотрите возможность проверки других условий, например, с помощью инструкции MySQL CASE (доступной в хранимой программе MySQL, не путать с выражением CASE.)

CASE
  WHEN NEW.weight < OLD.weight 
  THEN SET @description = CONCAT('You lost ', OLD.weight - NEW.weight, ' kgs');

  WHEN NEW.weight > OLD.weight
  THEN SET @description = CONCAT('You gained ', NEW.weight - OLD.weight, ' kgs');
  WHEN NEW.weight = OLD.weight
  THEN SET @description = 'Weight is unchanged';
  ELSE SET @description = 'NEW and/or OLD weight IS NULL';
END 

Для отладки рассмотрите сохранение этих значений в пользовательских переменных (чтобы вы могли запрашивать переменные после запуска триггера из того же сеанса).

Или рассмотрите возможность добавления значений к описательному сообщению,

CONCAT(...,' ow=',IFNULL(OLD.weight,'NULL'),' nw=',IFNULL(NEW.weight,'NULL'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...