尝试在表中插入不存在的记录时出现 DB2 -803 错误

Posted

技术标签:

【中文标题】尝试在表中插入不存在的记录时出现 DB2 -803 错误【英文标题】:DB2 -803 Error When Trying to Insert a Non-existent Record in Table 【发布时间】:2016-03-03 01:20:38 【问题描述】:

用户在尝试向数据库添加新记录时遇到此错误:

com.jcorporate.expresso.core.db.DBException:无法将记录添加到数据库以获取数据库“默认”中键为“CSQ119/C/CSQ119.1/SBF1041406”的记录:无法执行语句:INSERT INTO CP_INDUSR (IND_LAST_UPDATE,IND_SUB_CAT_ID,IND_CAT_ID,IND_LAST_UPDATE_USER,IND_TYPE,IND_USER_TYPE,IND_USER_NAME,IND_USER_ID)值('20160302','CSQ119.1','CSQ119','SB1041001','C','U','Palwasha Ashraf 'SBF1041406')(StatisticsDBObject, db/context 'default'):DB2 SQL 错误: SQLCODE=-803, SQLSTATE=23505, SQLERRMC=1;CARDPRO.CP_INDUSR, DRIVER=3.61.65 (INSERT INTO CP_INDUSR (IND_LAST_UPDATE, IND_SUB_CAT_ID, IND_CAT_ID、IND_LAST_UPDATE_USER、IND_TYPE、IND_USER_TYPE、IND_USER_NAME、IND_USER_ID)值('20160302'、'CSQ119.1'、'CSQ119'、'SB1041001'、'C'、'U'、'Palwasha Ashraf'、'SBF1041406') :DB2 SQL 错误:SQLCODE=-803, SQLSTATE=23505, SQLERRMC=1;CARDPRO.CP_INDUSR, DRIVER=3.61.65

但是当我要求用户执行这个命令时:

db2 "select * from CP_INDUSR where IND_CAT_ID='CSQ119' AND IND_TYPE='C' AND IND_SUB_CAT_ID='CSQ119.1' AND IND_USER_ID='SBF1041406'"

结果返回 0。

所以我想知道这是怎么发生的,因为表中显然不存在该记录,但在尝试执行插入时遇到了 -803 错误。

感谢您在此问题上的专业知识,并提前致谢。

【问题讨论】:

这是您事务中唯一的语句(和插入)吗?这个表的主键是什么? 在执行这个之前,还有另一个插入语句到另一个表中。此表的 PK:IND_CAT_ID、IND_TYPE、IND_SUB_CAT_ID 和 IND_USER_ID。 【参考方案1】:

运行插入时可能导致 SQL0803 的原因:

插入已经存在的行 => 您只搜索了该行尝试仅选择主键字段

db2 "select * from CP_INDUSR where IND_CAT_ID='CSQ119' AND IND_SUB_CAT_ID='CSQ119.1' AND IND_USER_ID='SBF1041406'"

在同一事务中使用相同的 pk 值插入多行 - => 你再次写了这不是你所做的

插入违反另一个唯一约束(除了主键)的行 => 因此检查该表是否存在其他唯一索引

【讨论】:

谢谢你的解释。我检查了桌子上的索引,只有四个Pk是索引。

以上是关于尝试在表中插入不存在的记录时出现 DB2 -803 错误的主要内容,如果未能解决你的问题,请参考以下文章

插入记录时出现 Informix“没有这样的 DBspace”错误

如果已存在则更新行,否则使用 mysql 在表中插入新记录

尝试定义 FOREIGN KEY 时出现“表中不存在键列”

在Access 2010中运行追加查询时出现“表已存在”错误

使用PK标识列在表中插入期间AS400 DB2重复键错误

将新记录插入特定表时出现死锁