after-update-trigger-using-concat\u-ws:为什么要在我不想要的地方插入换行符?

2eafrhcq  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(494)

预期的结果是将一个字段的编辑注解存储在另一个字段中。我想把新的注解附加到存储字段中,由于不是函数做的,所以我试图找到一种方法来解决这个问题,而不需要添加更多的代码层,比如函数和存储过程。

/* 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 ':'

一些新的/更有经验的眼睛会对调试这个非常有帮助。
谢谢。

wh6knrhe

wh6knrhe1#

我觉得你应该用普通的 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 这里,主要是为了在多个术语之间添加分隔符。在每个日志语句之间只需要一个换行符。

相关问题