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

如何获取表A新增行ID并在表B生成对应复制行(复用上一行Department)

表A新增行后同步生成表B对应行的SQL实现

要实现表A新增行后自动在表B生成对应行,且复用表B最后一行的Department值,最可靠的方式是使用数据库触发器,自动触发同步逻辑。以下是主流数据库的具体实现:

PostgreSQL 实现

-- 创建触发器函数
CREATE OR REPLACE FUNCTION sync_table_b()
RETURNS TRIGGER AS $$
DECLARE
    last_dept VARCHAR; -- 请根据表B的Department字段类型调整(如INT、VARCHAR等)
BEGIN
    -- 获取表B最后一行的Department值
    SELECT Department INTO last_dept
    FROM B
    ORDER BY ID DESC
    LIMIT 1;

    -- 处理表B为空的场景,设置默认部门值
    IF last_dept IS NULL THEN
        last_dept := '默认部门'; -- 替换为业务实际的默认值
    END IF;

    -- 插入表B,使用表A新增行的ID
    INSERT INTO B(ID, Department)
    VALUES(NEW.ID, last_dept);

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- 创建行级触发器,表A插入后触发
CREATE TRIGGER trigger_after_insert_a
AFTER INSERT ON A
FOR EACH ROW
EXECUTE FUNCTION sync_table_b();

MySQL 实现

-- 修改分隔符,避免触发器内的分号冲突
DELIMITER //
CREATE TRIGGER trigger_after_insert_a
AFTER INSERT ON A
FOR EACH ROW
BEGIN
    DECLARE last_dept VARCHAR(255); -- 匹配表B的Department字段类型
    -- 获取表B最后一行的Department值
    SELECT Department INTO last_dept
    FROM B
    ORDER BY ID DESC
    LIMIT 1;

    -- 处理表B为空的场景
    IF last_dept IS NULL THEN
        SET last_dept = '默认部门'; -- 替换为业务默认值
    END IF;

    -- 插入表B
    INSERT INTO B(ID, Department)
    VALUES(NEW.ID, last_dept);
END //
DELIMITER ;

补充说明

  • 上述触发器为行级触发器,批量插入表A时(比如一次性插入5行),会逐行生成表B的对应行,每行的Department都会复用表B当前的最后一行值,完全符合需求。
  • 请根据实际业务调整last_dept的变量类型,确保和表B的Department字段类型一致。
  • 如果需要手动同步历史数据(比如补同步之前表A已存在但表B没有的行),可以执行以下SQL:
INSERT INTO B(ID, Department)
SELECT a.ID, (SELECT Department FROM B ORDER BY ID DESC LIMIT 1)
FROM A a
WHERE a.ID NOT IN (SELECT ID FROM B);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 01:20:57