如何在M_TAX_ORG表插入记录时自动向M_TAX_ORG_ADM_INFO表新增记录?
用触发器实现关联表自动插入记录
要实现向M_TAX_ORG插入新记录时,自动向关联表M_TAX_ORG_ADM_INFO插入对应数据,触发器是可行方案,但你提供的脚本存在两个核心问题:
- 用
max(M_TAX_ORG_ADM_INFO_ID)+1生成主键并发不安全,多线程同时插入时会触发主键重复冲突; - 当
M_TAX_ORG_ADM_INFO为空表时,max()返回null,导致主键字段插入空值,违反非空约束。
推荐实现方案(基于序列生成主键)
Oracle中最稳妥的方式是用序列生成自增主键,避免并发问题:
1. 创建主键序列
CREATE SEQUENCE SEQ_M_TAX_ORG_ADM_INFO START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;
2. 创建修正后的触发器
CREATE OR REPLACE TRIGGER M_TAX_ORG_AFTER_INSERT AFTER INSERT ON M_TAX_ORG FOR EACH ROW BEGIN INSERT INTO M_TAX_ORG_ADM_INFO ( M_TAX_ORG_ADM_INFO_ID, RNN, IIN_BIN, NAME_R, NAME_K, M_TAX_ORG_ID, IS_MAIN, IS_ACTIVE, EXTERNAL_ID ) VALUES ( SEQ_M_TAX_ORG_ADM_INFO.NEXTVAL, -- 用序列获取唯一主键 :NEW.RNN, :NEW.IIN_BIN, :NEW.NAME_R, :NEW.NAME_K, :NEW.M_TAX_ORG_ID, :NEW.IS_MAIN, :NEW.IS_ACTIVE, :NEW.EXTERNAL_ID ); END; /
替代方案(无序列权限时使用)
如果因权限限制无法创建序列,可以通过加表锁+处理空值的方式临时解决(不推荐高并发场景):
CREATE OR REPLACE TRIGGER M_TAX_ORG_AFTER_INSERT AFTER INSERT ON M_TAX_ORG FOR EACH ROW DECLARE v_M_TAX_ORG_ADM_INFO_id NUMBER; BEGIN -- 加排他锁避免并发冲突 LOCK TABLE M_TAX_ORG_ADM_INFO IN EXCLUSIVE MODE; -- 空表时默认从1开始 SELECT NVL(max(M_TAX_ORG_ADM_INFO_ID), 0) + 1 INTO v_M_TAX_ORG_ADM_INFO_id FROM M_TAX_ORG_ADM_INFO; INSERT INTO M_TAX_ORG_ADM_INFO ( M_TAX_ORG_ADM_INFO_ID, RNN, IIN_BIN, NAME_R, NAME_K, M_TAX_ORG_ID, IS_MAIN, IS_ACTIVE, EXTERNAL_ID ) VALUES ( v_M_TAX_ORG_ADM_INFO_id, :NEW.RNN, :NEW.IIN_BIN, :NEW.NAME_R, :NEW.NAME_K, :NEW.M_TAX_ORG_ID, :NEW.IS_MAIN, :NEW.IS_ACTIVE, :NEW.EXTERNAL_ID ); END; /
验证方法
插入测试数据到M_TAX_ORG,然后查询关联表确认同步结果:
INSERT INTO M_TAX_ORG (M_TAX_ORG_ID, RNN, IIN_BIN, NAME_R, NAME_K, IS_MAIN, IS_ACTIVE, EXTERNAL_ID) VALUES (1, 'TEST_RNN', 'TEST_IIN', 'NAME_R_TEST', 'NAME_K_TEST', 'Y', 'Y', 'EXT_001'); SELECT * FROM M_TAX_ORG_ADM_INFO WHERE M_TAX_ORG_ID = 1;
内容的提问来源于stack exchange,提问作者Amir Okay
相关产品推荐
相关产品推荐

