解决 Oracle 自增主键插入时报主键冲突的问题
描述:您向一个具有自增主键的表中插入记录,但是却遇到了主键冲突的错误。这可能是因为您设置的自增主键的初始值已经被表中的现有记录使用了。
解决和分析步骤
这里以GZGL_NOTICE表为例,表中ID为自增的属性
//查看表中序列名 (一般设置的序列名都与原表名有相似之处)
SELECT sequence_name FROM user_sequences;
sequence_name
----------------------------
GZGL_SEQ_NOTICE_ID
SEQ_SS_DEPARTMENT
SEQ_SS_QUESTIONTYPE
SEQ_SS_USER
-----------------------
//GZGL_NOTICE表ID自增序列名称就是GZGL_SEQ_NOTICE_ID
//查看当前的序列 GZGL_SEQ_NOTICE_ID的下一个值
SELECT GZGL_SEQ_NOTICE_ID.NEXTVAL FROM DUAL;
GZGL_SEQ_NOTICE_ID.NEXTVAL
----------------------------------
460
//查看表GZGL_NOTICE表的最大ID值
SELECT MAX(ID) FROM GZGL_NOTICE;
MAX(ID)
-----------------------------------
1450
//分析:这里发现MAX(ID)的值比序列 GZGL_SEQ_NOTICE_ID的下一个值要大,明显有问题,需要将GZGL_SEQ_NOTICE_ID的值变大
//设置该序列递增值 保证下一次的执行数值要比当前数据库中最大的ID要大 值可以选择比MAX(ID)-GZGL_SEQ_NOTICE_ID.NEXTVAL的结果要大,上面的值就是1450-460=990 我们可以取1000
ALTER SEQUENCE GZGL_SEQ_NOTICE_ID Increment By 1000;
//查看设置好的序列 GZGL_SEQ_NOTICE_ID的下一个值
SELECT GZGL_SEQ_NOTICE_ID.NEXTVAL FROM DUAL;
GZGL_SEQ_NOTICE_ID.NEXTVAL
----------------------------------
1460
//将序列递增值修改为原来的按1递增
ALTER SEQUENCE GZGL_SEQ_NOTICE_ID Increment By 1;
//查看设置好的序列 GZGL_SEQ_NOTICE_ID的下一个值
SELECT GZGL_SEQ_NOTICE_ID.NEXTVAL FROM DUAL;
GZGL_SEQ_NOTICE_ID.NEXTVAL
----------------------------------
1461