目录
- 场景
- 异常
- 原因
- 解决
- 方法一:删除数据重新insert
- 方法二:刚刚自增主键的起始值
场景
1、对接民航电子数据库
2、由于truncate、drop
命令会使数据库报错:执行失败,[E14011]资源忙(加锁超时)
,所以用了replace into
命令来整理表数据
异常
新增数据时报错
org.springframework.jdbc.UncategorizedSQLException:
### Error updating database. Cause: java.sql.SQLException: [E13001] 违反唯一值约束
### The error may involve com.xxx.mapper.icip.policy.QueuePolicyMapper.insertSelective-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO t_mb_xxx ( xxx,xxx,xxx ) VALUES( ?,?,? )
### Cause: java.sql.SQLException: [E13001] 违反唯一值约束
; uncategorized SQLException; SQL state [cae13001]; error code [13001]; [E13001] 违反唯一值约束 ; nested exception is java.sql.SQLException: [E13001] 违反唯一值约束
以上省略表结构以SQL语句(表主键为自增主键)
原因
是使用replace into
整理表数据导致
replace into
保存的数据,民航电子数据库不会维护自增主键,导致直接冲突
解决
方法一:删除数据重新insert
该方法就不再赘述了
方法二:刚刚自增主键的起始值
– 第一步:查询出seq_name
select seq_name,curr_val,cache_val from dba_sequences where seq_id in (
select serial_id from dba_columns where table_id in
(select table_id from dba_tables where table_name =‘表名’));
– 第二步:查出表当前ID最大值
select max(id) from 表名;
– 第三步:修改序列当前值
ALTER SEQUENCE 模式名.第一步查询出来的seq_name START WITH 表最大值+1;