MySQL после триггера обновления с использованием CONCAT_WS: почему он вставляет новую строку, где я этого не хочу? - PullRequest
0 голосов
/ 31 декабря 2018

Предполагаемый результат - сохранить примечания о внесении изменений в поле в другом поле.Я хочу, чтобы новые примечания добавлялись к полю хранения, и, поскольку это не функция, которая делает это, я пытаюсь найти способ решить эту проблему без добавления дополнительных слоев кода, таких как функции и хранимые процедуры.

/* Before Update Trigger */

DECLARE v_description VARCHAR(255);
DECLARE v_permnotes MEDIUMTEXT;
DECLARE v_oldnote VARCHAR(500);
DECLARE v_now VARCHAR(25);

SET v_now = TRIM(DATE_FORMAT(NOW(), '%Y-%m-%d %k:%i:%s'));

SET v_oldnote = OLD.notes;

IF (NEW.permanent_notes IS NULL) THEN
  SET v_permnotes = '';
ELSE
  SET v_permnotes = OLD.permanent_notes;
END IF;

SET NEW.permanent_notes = CONCAT_WS(CHAR(10), v_permnotes, v_now,": ", v_description);

Я стремлюсь к тому, чтобы результаты в постоянном поле выглядели следующим образом

<datetime value>: Some annotation from the notes field.
<a different datetime>: A new annotation
etc....

Что я получу от моего текущего триггера:

2018-12-30 17:15:50
: 
Test 17: Start from scratch. 
2018-12-30 17:35:51
: 
Test 18: Used DATE_FORMAT to sxet the time 
2018-12-30 17:45:52
: 
Test 19. Still doing a carriage return after date and after ':'

Я не могу понятьпочему после даты стоит новая строка, а затем снова после ':'.

Если я опущу CHAR (10), я получу:

Test 17: Start from scratch. 
2018-12-30 17:35:51
: 
Test 18: Used DATE_FORMAT to sxet the time 
2018-12-30 17:45:52
: 
Test 19. Still doing a carriage return after date and after ':'Test 20. Still doing a carriage return after date and after ':'

Некоторые свежие / более опытныеглаза были бы очень полезны при отладке.

Спасибо.

1 Ответ

0 голосов
/ 31 декабря 2018

Я думаю, вы должны просто использовать обычный CONCAT здесь:

DECLARE separator VARCHAR(1);

IF (NEW.permanent_notes IS NULL) THEN
    SET separator = '';
ELSE
   SET separator = CHAR(10)
END IF;

-- the rest of your code as is

SET
    NEW.permanent_notes = CONCAT(v_permnotes, separator, v_now, ": ", v_description);

Логика здесь в том, что мы условно печатаем новую строку (CHAR(10)) перед каждым новым журналомдо тех пор, пока эта строка не самая первая.Вы действительно не хотите CONCAT_WS здесь, что в основном для добавления разделителя между несколькими терминами.Вам нужен только один символ новой строки между каждым оператором ведения журнала.

...