GBase 8s
适配迁移
问答

使用gorm-gbase8s链接数据库后,部分表数据插入失败,是否是 sql中的字段值和表中的字段类型不匹配导致的? 还是唯一索引值的问题?

发表于2025-12-18 17:52:2089次浏览11个评论

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

之前提的问题忘开评论了,重新发一下:

【GBase版本】: 363

【操作系统】:centos7.6

【CPU】:4核

【问题描述】*:使用gorm-gbase8s库,正确配置环境变量,使用GSDK后,成功 链接数据库后,在运行插入sql语句时,部分表提示插入失败

以下是我的两张表结构和相关的插入sql语句,其中ds_confer_member表是插入成功的,但是ds_confer_conferinfo是插入失败的,我想知道的是是否是因为sql语句传值的问题,如果是的话,大概是哪些字段类型或者默认值设置的问题? 或者是插入sql语句中相关字段对应的值的类型问题?

希望可以解答下我的问题,感觉适配好难啊 。。。

报错的:错误: ERROR: -391:  23000 : Integrity constraint violation   

到底是数据库字段类型跟sql插入的值不匹配的问题,还是数据库表的完整性约束违反,唯一索引值的问题呀?

 

其中两张表字段内容分别如下:

 

我的sql插入语句相关日志运行情况如下:
     失败的:

     2025-12-18 16:40:31.509 ERROR   gorm@v1.30.0/callbacks.go:134   SQL执行出错: INSERT INTO "ds_confer_conferinfo" ("CONFER_ID","ELOGO","ROOM_ID","URL","TYPE","STATUS","THEME","FIRE_DATE","IS_PUBLIC","POP_UI_SWITCH","MODEL","FIRE_PERSON","FIRE_PERSON_NAME","PASS_WORD","ROOM_TYPE","VERSION","PLATFORM","PROVIDER","VOUCHER","END_DATE","GROUP_ID","ISPUSH_TEMPMSG","DEGREEOFSECRETS","CONFER_TEMPLATE_STATUS","MRID","EXPECT_END_DATE","IP_PORT","RESOLUTION") VALUES ('533638269','bxy','21256856927-1766047221893','https://192.168.140.244:10670/o/NkTMbDzNrkjM4MjY5','unbindconfer','doing','llll9009',1766047227901,1,'On','micro','21256856927','5Y2c6ZSm5YWD','','confer','1','','','',0,'','','{}','','',0,'192.168.140.244:10670','') | 影响行数: 0 | 耗时: 321.881728ms | 错误: ERROR: -391:  23000 : Integrity constraint violation  

2025-12-18 16:40:31.509 ERROR   impl/confer.go:956      conferDBService--StructInsertConferInfo failed, error:ERROR: -391:  23000 : Integrity constraint violation    

 

主要错误是: ERROR: -391:  23000 : Integrity constraint violation 

 

成功的:
2025-12-18 16:40:31.509 DEBUG   impl/confer_member.go:21        conferDBService--获取ConferMemberDaoImpl实例
2025-12-18 16:40:31.509 DEBUG   impl/confer_member.go:87        conferDBService--StructInsertConferMember 批量插入会议成员信息
2025-12-18 16:40:31.509 DEBUG   impl/common.go:26       当前的数据库类型是:gbase8s,转化后:gbase8s,查询的结果是:%!s(bool=true) 
2025-12-18 16:40:31.837 INFO    gorm@v1.30.0/callbacks.go:134   SQL执行成功: DELETE FROM "ds_confer_member" WHERE "ROOM_ID" ='21256856927-1766047221893' AND "MEMBER" ='21256856927' | 影响行数: 0 | 耗时: 327.415092ms
2025-12-18 16:40:31.837 DEBUG   impl/confer_member.go:105       conferDBService--StructInsertConferMember delete ConferMember: RowsAffected:0
2025-12-18 16:40:32.425 INFO    gorm@v1.30.0/callbacks.go:134   SQL执行成功: INSERT INTO "ds_confer_member" ("CONFER_ID","ELOGO","ROOM_ID","MEMBER","IS_MANAGER","ENTER_STATUS","NAME","RANK","SECRET_KEY","FIRSTENTRYTIME","LASTLEAVETIME","TOTALTIME","ENTRYNUMBER","PLATFORM") VALUES ('533638269','bxy','21256856927-1766047221893','21256856927',1,0,'5Y2c6ZSm5YWD','onwer','','','','','','') | 影响行数: 1 | 耗时: 587.968936ms
2025-12-18 16:40:32.425 DEBUG   impl/confer_member.go:127       conferDBService--StructInsertConferMember Insert ConferMember: RowsAffected:1
2025-12-18 16:40:32.425 DEBUG   ServerLib/ConferDataBaseService.go:877  conferDBService--PostMicroInfo end

 

 

另外同一张表的sql插入也有成功和失败的:

它插入就是失败的
INSERT INTO "ds_confer_member" ("CONFER_ID","ELOGO","ROOM_ID","MEMBER","IS_MANAGER","ENTER_STATUS","NAME","RANK","SECRET_KEY","FIRSTENTRYTIME","LASTLEAVETIME","TOTALTIME","ENTRYNUMBER","PLATFORM") VALUES ('temp','bxy','21256856927-1766047221893','21256856927',0,1,'','','','','','','','') | 影响行数: 0 | 耗时: 324.095368ms | 错误: ERROR: -391: 23000 : Integrity constraint violation

更新是成功的: UPDATE "ds_confer_member" SET "ENTER_STATUS"=1 WHERE "ROOM_ID" = '21256856927-1766047221893' AND "ELOGO" = 'bxy' AND "MEMBER" = '21256856927' | 影响行数: 0 | 耗时: 319.636767ms

它插入就是成功的: SQL执行成功: INSERT INTO "ds_confer_member" ("CONFER_ID","ELOGO","ROOM_ID","MEMBER","IS_MANAGER","ENTER_STATUS","NAME","RANK","SECRET_KEY","FIRSTENTRYTIME","LASTLEAVETIME","TOTALTIME","ENTRYNUMBER","PLATFORM") VALUES ('533638269','bxy','21256856927-1766047221893','21256856927',1,0,'5Y2c6ZSm5YWD','onwer','','','','','','') | 影响行数: 1 | 耗时: 587.968936ms

 

 

好难啊,适配

评论

登录后才可以发表评论
用户头像
GBase用户28017发表于 7个月前
学习。
用户头像
路路路发表于 7个月前
稍等技术回复
卜锦元发表于 7个月前
@路路路:无论是客服 还是 技术 都对问题响应的很及时,且高效有效率
很感谢!!!
用户头像
琳大大发表于 7个月前
往表结构有not null的字段插入null值了,所以报错391.
最佳回答
卜锦元发表于 7个月前
@琳大大:牛牛牛牛牛!!!
很感谢,成功了。
卜锦元发表于 7个月前
@琳大大:确实是,
已经确定了,gabse-gorm转化后的sql语句中,如果出现了''空字符串这类空值,在gabse8s的sql处理逻辑中,它是当中null来处理的,然后数据库对应的字段如果是非null值的设定的话,就会报错391,违反完整性约束

可能不同的数据库对于gorm转化后的sql语句中的一些‘’空值处理方式不一致,mysql、postgresql等都是‘’空值是空值,null值是null值,不同的数据库我这边需要注意适配方式就可以
用户头像
琳大大发表于 7个月前
@卜锦元:嗯嗯,这个是server端参数控制ENABLE_NULL_STRING为1时null与空串等价,为0时null不等于空串,默认为1
用户头像
GBase用户28017发表于 7个月前
@琳大大:高手啊。
用户头像
GBase用户28017发表于 7个月前
学习。
用户头像
levvel发表于 3个月前
太有深度了!
用户头像
山佳发表于 2个月前
学习了