You need to enable JavaScript to run this app. 修改MySQL触发器:插入新公开备注时拼接note_public字段而非覆盖
优惠活动
大模型
产品
解决方案
定价
更多

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 11:15:00