存储过程插入数据触发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
相关产品推荐
相关产品推荐

