主键冲突-单据体主键冲突原创
3人赞赏了该文章
2,231次浏览
编辑于2023年01月04日 18:12:57
一、问题描述
单据保存时,报错提示:
java.sql.SQLException: com.mysql.cj.exceptions.CJException: Duplicate entry '1519551591009507328' for key ..... /*ORM*/ INSERT INTO tk_kded_basetest(FId,fk_kded_basedatafield1,fmodifierfield, fk_kded_textfield1,fmodifydatefield,FSeq,FEntryId) VALUES (?,?,?,?,?,?,?)
二、问题分析
根据报错日志我们可以分析到保存时,往这个表“tk_kded_basetest”插入数据时,出现主键'tk_kded_basetest.PRIMARY'冲突。
1、打开数据库表
tk_kded_basetest表的主键是FID
2、单据实体中,定义了单据体的表“tk_kded_basetest”中,定义了”FEntryID"才是单据体表的主键。
(1)因此,在单据保存时,单据体中新增存在两条数据进行保存时,苍穹平台会调用orm往表“tk_kded_basetest”中插入两条FID一样,FEntryID唯一的。在正常的单据保存中FID是单据的表的主键,FEntryID是单据体表的主键;
(2)又因为数据库表中“tk_kded_basetest”中的主键已经定义为了“FID”,因此走orm接口保存生成两条FID值一样的数据时,会触发主键冲突的报错(主键值是唯一的)。
三、结论
为什么会出现主键被定义成了FID的情况,是因为有一个基础资料中已经定义了它的实体表为”tk_kded_basetest“,也就是前面的单据中的单据体表和该基础资料的表名一样导致的问题。
这个问题在V5.0.002版本之后已经优化,在保存的时候,提示了表名重复,所以要注意避免这种情况的表名重复使用。
四、扩展
1、修改单据体表为“tk_kded_entryentryclz”之后,我们可以看到单据体表和单据表的关系如下:
(1)单据表的列属性:
单据体表的列属性
前端表单页面:
数据库中的数据:
赞 3
3人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读