【Oracle】ORA-00001: 违反唯一约束条件 (CHRIST.PK_SYS_BILL_TYPE)

背景:

后台服务测试过程中,发现往oracle数据库表中插数据出现一个错误 unique constraint,如下:

### Error updating database.  Cause: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: 违反唯一约束条件 (CHRIST.PK_SYS_BILL_TYPE)

### The error may exist in com/zhenhan/fund/system/mapper/SysBillTypeMapper.java (best guess)
### The error may involve com.zhenhan.fund.system.mapper.SysBillTypeMapper.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO SYS_BILL_TYPE (BILL_TYPE_ID, BILL_TYPE_CODE, BILL_TYPE_NAME, BILL_UUID, PREFIX_CODE, GENERATION_RULE_TYPE, SERIAL_NUMBER_LENGTH, CURRENT_MAX_NUMBER, ATTACH_SERVER_ID, IS_DISABLE, WF_TEMP_ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
### Cause: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: 违反唯一约束条件 (CHRIST.PK_SYS_BILL_TYPE)

; ]; ORA-00001: 违反唯一约束条件 (CHRIST.PK_SYS_BILL_TYPE)
; nested exception is java.sql.SQLIntegrityConstraintViolationException: ORA-00001: 违反唯一约束条件 (CHRIST.PK_SYS_BILL_TYPE)

原因:

根据提示的索引号,找到了表中的字段“SEQ_NO”,发现是因为测试数据库是由另一个数据库同步过来的,表中自动的序列号被打乱,导致下一次插入数据的时候,sql自动生成的序列号所在的位子已经有了数据,所以导致了唯一约束错误。当然数据的错误删除和人为的错误操作都会导致这个问题。

解决:

首先,我们可以查询一下这个表的序列号在什么位子(我的表为:SYS_BILL_TYPE、表序列为:SEQ_SYS_BILL_TYPE)

SELECT SEQ_SYS_BILL_TYPE.NEXTVAL  FROM DUAL

不要随便执行这个sql,因为没执行一次,索引值都会自增+1;查询到结果后,对比表中现有的数据,进行对比,如果表中SEQ_NO的值大于查询到的值,就将把索引值进行更新,设定序列步长为100(一般都是1),执行下面sql:

ALTER SEQUENCE SEQ_SYS_BILL_TYPE increment BY 100

注意:SEQ_SYS_BILL_TYPE 是表序列名,还有就是索引值不能修改当前值,只能修改增加,不能减少。

提示:

查询所有所有索引:

select * from user_sequences;

删除索引:

DROP SEQUENCE SEQ_SYS_BILL_TYPE;

创建索引:

CREATE SEQUENCE SEQ_SYS_BILL_TYPE
INCREMENT BY 1
START WITH 1
NOCYCLE
 NOCACHE;

总结:

DROP SEQUENCE SEQ_SYS_BILL_TYPE;

CREATE SEQUENCE SEQ_SYS_BILL_TYPE
INCREMENT BY 1
START WITH 1
NOCYCLE
 NOCACHE;
 
SELECT SEQ_SYS_BILL_TYPE.NEXTVAL  FROM DUAL
ALTER SEQUENCE SEQ_SYS_BILL_TYPE increment BY 100

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值