You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于触发器实现A、B表数据合并至C表的技术需求及问题咨询

正确实现B表INSERT触发的行级触发器方案

原代码存在的问题

你的触发器逻辑完全不符合需求:

  • 每次插入B表时执行两次独立的INSERT,第一次仅插入integerB字段,会生成无关联数据的空行;第二次直接全量插入A表所有行,每次触发都会重复插入A表数据,完全没实现“对应行”的匹配逻辑。
  • 没有处理C表已存在目标行的更新场景,也未对sequence列做自增赋值处理。

正确实现方案

我们使用Oracle的MERGE语句(支持“存在则更新,不存在则插入”的逻辑),搭配序列来实现需求:

1. 创建自增序列(用于sequence列赋值)

CREATE SEQUENCE seq_c_sequence 
START WITH 1 
INCREMENT BY 1;

2. 编写行级触发器

CREATE OR REPLACE TRIGGER trig_after_insert_b
AFTER INSERT ON B
FOR EACH ROW
BEGIN
    MERGE INTO C
    USING (
        -- 获取A表中与刚插入的B行匹配的对应数据
        SELECT a.id, a.name, a.date, a.realnumber, a.integer
        FROM A a
        WHERE a.id = :NEW.id
    ) a
    -- 以id作为匹配条件,判断C表是否已存在该行
    ON (C.id = a.id)
    WHEN MATCHED THEN
        -- 已存在则仅更新integerB字段
        UPDATE SET C.integerB = :NEW.integer
    WHEN NOT MATCHED THEN
        -- 不存在则插入A表数据,同时设置integerB和自增sequence
        INSERT (id, name, date, realnumber, integer, integerB, sequence)
        VALUES (a.id, a.name, a.date, a.realnumber, a.integer, :NEW.integer, seq_c_sequence.NEXTVAL);
END;
/

逻辑说明

  • MERGE语句是处理这类“Upsert”(更新或插入)场景的最优方式,避免了先查询再判断的冗余操作,同时保证原子性。
  • 通过:NEW.id关联A表和刚插入的B表行,确保只处理对应的数据行。
  • 当C表已存在对应id的行时,仅更新integerB为B表新插入行的integer值;不存在时,插入A表的完整数据,并通过序列为sequence列赋予从1开始的自增值。

内容的提问来源于stack exchange,提问作者H22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:35:20