【问题详细描述】
1. 在创建表之前设置表名、字段名等大小写不敏感:
set global lower_case_file_system=OFF
set global lower_case_table_names=1
2. 建表信息如下:
CREATE TABLE `is_ac_session` (
`session_ID` varchar(100) COLLATE utf8mb4_bin NOT NULL,
`USER_ID` decimal(10,0) DEFAULT NULL,
`LOGIN_IP` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL,
`PLANT_ID` decimal(3,0) DEFAULT NULL,
`PLAN_SESSION_ID` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL,
`CREATE_TIME` datetime DEFAULT CURRENT_TIMESTAMP,
`AUTH_TOKEN` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL,
`SUBUSER_TYPE` decimal(3,0) DEFAULT '0',
`SUBUSER_CATE` decimal(3,0) DEFAULT '0',
`SUBUSER_CODE` varchar(40) COLLATE utf8mb4_bin DEFAULT NULL,
PRIMARY KEY (`session_ID`),
KEY `IDX_IS_AS_SESSION_AUTH` (`AUTH_TOKEN`),
KEY `IDX_IS_AS_SESSION_USER` (`USER_ID`, `CREATE_TIME`)
) ENGINE=SEQUOIADB DEFAULT CHARSET=utf8mb4_bin;
3. 通过JDBC插入数据时,报错java.sql.SQLException: Got error 40339 from storage engine,插入数据如下:
insert into is_ac_session(session_id, user_id,login_ip,plant_session_id,create_time,auth_token,subuser_cate,subuser_type,subuser_code) values ('8e5b210abc24255c43800000001', 171839277, '0:0:0:0:0:0:1',6, '8e5b210abc22B5262E4A4B', sysdate(),'0e3f0ffba69c7872a45d21b50726322d',0,0,0);
【解决办法】
1. 40399错误对应 SequoiaDB 的-339错误码,其错误描述为:索引键的任意一个字段都不允许不存在或者为 NULL;
2. 查看报错的数据节点的日志文件,发现-339处的错误日志中,显示插入失败的记录为{“session_ID”:"8e5b210abc24255c43800000001"},而通过 SequoiaDB Shell 查询该字段的字段名为大写的 “SESSION_ID” ,显然,客户端中表的字段名与服务端对应的集合字段名大小写不对称,且该字段又为索引字段,因此通过 JDBC 端插入数据时,由于SequoiaDB 端不存在名为 “session_ID” 字段,导致报错-339;
3. 经定位,原来在最初创建表时字段 “SESSION_ID” 为大写,建表以后插入数据正常。而后来经过人为的去修改字段属性,将 “SESSION_ID” 改成了 “session_ID”,而此时由于字段名已大小写不敏感了,因此 SequoiaDB 端没有对应调整字段名与修改后的一样,即还是全大写,导致在后续的插入操作中,SequoiaDB 认为字段 “session_ID” 不存在而报错-339;
4. 建议建表、改表的操作要谨慎,建表改表时注意统一大小写规范。