ora-00001违反唯一约束
报错日志:
org.springframework.dao.DuplicateKeyException:### Error updating database.Cause: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: 违反唯一约束条件 (RPA_USER.PK_ACCEPTED_WITNESSVIDEO)### The error may exist in com/bairuitech/anychat/iaccount/dao/TAcceptedWitnessvideoMapper.java (best guess)### The error may involve com.bairuitech.anychat.iaccount.dao.TAcceptedWitnessvideoMapper.insert-Inline### The error occurred while setting parameters### SQL: INSERT INTO T_ACCEPTED_WITNESSVIDEO( ID,SRV_STREAM, CUST_NAME, CUST_STREAM, SYS_PATH, SRV_ID, CUST_ID,SRV_NAME )VALUES( ?,?, ?, ?, ?, ?, ?,? )### Cause: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: 违反唯一约束条件 (RPA_USER.PK_ACCEPTED_WITNESSVIDEO); ORA-00001: 违反唯一约束条件 (RPA_USER.PK_ACCEPTED_WITNESSVIDEO); nested exception is java.sql.SQLIntegrityConstraintViolationException: ORA-00001: 违反唯一约束条件 (RPA_USER.PK_ACCEPTED_WITNESSVIDEO)
原因:
在表中要求唯一的值发生了冲突,比如现在id的值已经增长到了100,序列的下一个值是24,Oracle执行插入时,生成的id是24已经存在了
解决方法:
修改该表的下一个序列值大于当前最大的唯一值
步骤:
1.可以先看是哪张表哪个字段发生的冲突(一般是主键id):
select a.constraint_name,a.constraint_type,b.column_name,b.table_name from user_constraints a inner join user_cons_columns b on a.table_name=b.table_name where a.constraint_name='PK_ACCEPTED_WITNESSVIDEO'
2.查询Oracle数据库所有序列:
select * from USER_SEQUENCES;
3.查询指定数据库表序列id参数值(倒序)
select max(to_number(t.表id)) from 表名(所报异常查询表)t
4.查询当前表值的下一个序列值(对比上一步的查询结果)
SELECT序列名.NEXTVAL FROM dual;---执行后,序列会自增
5.修改序列的值的增长值:
alter sequence 序列名 increment BY X;----X为正数负数都可以
6.查询序列的下一个值:
SELECT序列名.NEXTVAL FROM dual;--查看是否已经大于id的最大值
7.重新将序列的值的增长值设为1
alter sequence 序列名 increment BY 1;---序列自增设为1