一、问题描述
今天在网db2数据库中添加数据的时候,抛出了这个异常,在网上查找资料是说 主键冲突了,我设置的主键是自增的,这是什么情况。
org.springframework.dao.DuplicateKeyException:
### Error updating database. Cause: com.ibm.db2.jcc.am.oo: DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=1;test.SYS_DICT_DATA, DRIVER=3.58.82
### The error may exist in file [D:\\target\classes\mapper\system\SysDictDataMapper.xml]
### The error may involve com.system.mapper.SysDictDataMapper.insertDictData-Inline
### The error occurred while setting parameters
### SQL: insert into sys_dict_data( dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time )values( ?, ?, ?, ?, ?, ?, ?, sysdate )
### Cause: com.ibm.db2.jcc.am.oo: DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=1;test.SYS_DICT_DATA, DRIVER=3.58.82
; DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=1;test.SYS_DICT_DATA, DRIVER=3.58.82; nested exception is com.ibm.db2.jcc.am.oo: DB2 SQL Error: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=1;test.SYS_DICT_DATA, DRIVER=3.58.82
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:247)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)
at com.sun.proxy.$Proxy97.insert(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272)
具体原因:
我运行的是测试代码,数据库中已存在数据,这写数据可能是别人手动添加进去的,加的时候指定了主键,当数据库再新增数据的时候(不指定主键),主键会按照默认的自增的顺序新增,由于数据库中已经存在了相应的主键,所以会抛出主键冲突的异常。
二、解决方法
解决方式:修改主键的自增基数,比如我数据库中现有数据的id最大是 24,那我就让数据库从25开始自增,具体的语句是:
alter table table_name alter ID restart with 25
这样问题就解决了