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

存储过程插入数据触发ORA-00001唯一约束违反问题求助

ORA-00001主键约束违反问题解决方法
  • 先确认主键自增机制是否正常
    Oracle里主键自增要么靠序列+触发器,要么是12c及以上版本的IDENTITY列。

    • 用序列的话,先查序列是否存在:SELECT * FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'TABLE1_SEQ';(把TABLE1_SEQ换成你的序列名)
    • 用IDENTITY列的话,检查表结构:SELECT COLUMN_NAME, GENERATION_TYPE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'TABLE1' AND COLUMN_NAME = '你的主键列名';,看GENERATION_TYPE是不是ALWAYS或者BY DEFAULT,不是的话说明没开自增。
  • 核对存储过程的插入逻辑
    确保插入语句没硬写主键值,比如正确的插入应该是:

    INSERT INTO TABLE1 (非主键列1, 非主键列2)
    SELECT 源表列1, 源表列2 FROM 你的源表 WHERE 筛选条件;
    

    要是显式指定了主键值,比如INSERT INTO TABLE1 (主键列, 列1) VALUES (100, 'xxx'),那肯定会冲突。

  • 检查序列当前值和表中主键的最大值是否冲突

    • 查序列当前值:SELECT TABLE1_SEQ.CURRVAL FROM DUAL;
    • 查表中最大主键:SELECT MAX(你的主键列名) FROM TABLE1;
    • 如果序列当前值≤表中最大主键,得重置序列:
      -- 12c及以上版本可以直接重启序列
      ALTER SEQUENCE TABLE1_SEQ RESTART START WITH (SELECT MAX(你的主键列名)+1 FROM TABLE1);
      -- 旧版本Oracle用以下语句
      ALTER SEQUENCE TABLE1_SEQ INCREMENT BY (SELECT MAX(你的主键列名)+1 - TABLE1_SEQ.CURRVAL FROM TABLE1);
      SELECT TABLE1_SEQ.NEXTVAL FROM DUAL;
      ALTER SEQUENCE TABLE1_SEQ INCREMENT BY 1;
      
  • 验证触发器状态(如果用触发器实现自增)

    • 查触发器是否存在且启用:SELECT * FROM USER_TRIGGERS WHERE TRIGGER_NAME = 'TABLE1_TRG';
    • 看触发器代码是不是给主键赋值了,正确的触发器应该是这样:
      CREATE OR REPLACE TRIGGER TABLE1_TRG
      BEFORE INSERT ON TABLE1
      FOR EACH ROW
      BEGIN
        SELECT TABLE1_SEQ.NEXTVAL INTO :NEW.你的主键列名 FROM DUAL;
      END;
      /
      
    • 要是触发器被禁用了,执行ALTER TRIGGER TABLE1_TRG ENABLE;启用它。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:03:27