如何获取表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
相关产品推荐
相关产品推荐

