最近在发布一个项目时,DB2数据库使用的是DB2MOVE进行迁移,迁移完成后发现部分表添加记录时提示:SQL0803N INSERT 语句、UPDATE 语句或由 DELETE 语句导致的外键更新中的一个或多个值无效,因为由 "1" 标识的主键、唯一约束或者唯一索引将表。百度上找了一种解决办法:
今天在修改一个配置的时候,突然报错:System.Data.OleDb.OleDbException: [DB2/NT] SQL0803N INSERT 语句、UPDATE 语句或由 DELETE 语句导致的外键更新中的一个或多个值无效,因为由 "1" 标识的主键、唯一约束或者唯一索引将表 "****" 的索引键限制为不能具有重复值。 SQLSTATE=23505
经同事分析为索引的起始值与当前已有记录的最大索引值不匹配造成的,验证过程如下:
1.SELECT max(被索引字段) FROM 表名 t 得到的结果是31950
2.打开表SELECT * FROM SYSIBM.SYSSEQUENCES;看下这个表的start字段的值是否是31950,结果是31864
于是执行了下面的语句来更正这个索引的起始值
3.alter sequence 索引名 restart with 31951
经过上面三步,数据就可以保存了。
总结:
造成这个错误的原因是索引没有及时更新,可能是由于事物延迟、崩溃或者数据瞬间导入量过多等原因。
在使用该办法处理后仍然无法解决,后来使用Toad工具ALTER表的字段,将主键起始值设置大一些。生成SQL,将表删除重建就解决了!