修改MySQL触发器:插入新公开备注时拼接note_public字段而非覆盖
触发器修改方案
问题根因
现有触发器的UPDATE语句直接将新插入的备注内容覆盖写入note_public字段,未读取字段已存储的历史值,因此每次触发都会清空原有内容。
改造逻辑
实现新旧值拼接时,需要先判断目标字段当前值是否为NULL/空字符串,避免拼接结果出现多余的前置分隔符,通过统一分隔符区分不同时间插入的公开备注,兼顾存储和后续可读性。
修改后的触发器代码
BEGIN IF (NEW.visibility = 1) THEN IF (NEW.item_type = 'propal') THEN UPDATE anas01_propal SET note_public = COALESCE( NULLIF(TRIM(note_public), ''), '' ) || CASE WHEN TRIM(note_public) IS NULL OR TRIM(note_public) = '' THEN '' ELSE CHAR(10) -- 分隔符可根据场景调整:网页端可用'<br>',纯文本用换行符 END || NEW.note_value WHERE rowid = NEW.item_id; ELSEIF (NEW.item_type = 'facture') THEN UPDATE anas01_facture SET note_public = COALESCE( NULLIF(TRIM(note_public), ''), '' ) || CASE WHEN TRIM(note_public) IS NULL OR TRIM(note_public) = '' THEN '' ELSE CHAR(10) END || NEW.note_value WHERE rowid = NEW.item_id; END IF; END IF; END
关键实现说明
- 使用
COALESCE+NULLIF处理目标字段为空/NULL的场景,避免直接拼接出现无效的NULL前缀 - 拼接逻辑为追加写入:原有内容完整保留,新插入的公开备注会按照分隔符追加到字段末尾,不会发生覆盖
- 可根据业务需要调整分隔符,比如需要标注备注时间的话,可在拼接时附带
datetime('now')生成时间戳标记 - 如果需要过滤空内容的备注,可在最外层的IF判断中追加
AND TRIM(NEW.note_value) != ''条件,避免空字符串触发无效更新
内容的提问来源于stack exchange,提问作者Anascode
相关产品推荐
相关产品推荐

