You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Babelfish for Aurora PostgreSQL插入不返回生成行ID如何修复

问题原因

该问题是Babelfish for Aurora PostgreSQL和mssql-jdbc驱动的协议兼容问题导致:
mssql-jdbc收到Statement.RETURN_GENERATED_KEYS参数时,默认会生成带SQL Server原生OUTPUT SCOPE_IDENTITY()逻辑的插入语句,通过TDS协议请求返回自增主键。你当前使用的Aurora PostgreSQL 13.6配套的Babelfish版本,对TDS协议下该返回逻辑的解析存在缺陷,无法正确读取序列生成的主键值,最终返回默认值0。
而PostgreSQL JDBC驱动走PostgreSQL原生协议时,是通过RETURNING子句获取主键,Babelfish对这部分原生协议的支持是完整的,所以可以正常返回ID值。

可落地的修复方案

按改造成本从低到高排序:

  • 方案1:代码中显式指定主键列名
    替换创建PreparedStatement的逻辑,不要使用通用的RETURN_GENERATED_KEYS标记,改为传入实际的自增主键列名数组,触发mssql-jdbc走兼容的主键返回逻辑,不需要改依赖、不需要动数据库配置。
    修改示例:
    // 原代码
    // PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
    // 替换为以下代码,将"id"替换为你业务表实际的自增主键列名
    PreparedStatement ps = conn.prepareStatement(sql, new String[]{"id"});
    
    这是Babelfish官方推荐的JDBC兼容写法,绝大多数场景下改完即可正常获取生成的主键。
  • 方案2:切换到PostgreSQL原生端口连接
    Babelfish会同时启动两个协议监听:1433端口对应SQL Server TDS协议,5432端口对应PostgreSQL原生协议。如果你的业务SQL没有强依赖SQL Server专属的T-SQL特殊语法,可以直接把连接URL改为PostgreSQL格式,使用你已经验证过正常的postgresql驱动连接5432端口,不需要修改插入逻辑即可正常返回主键。
  • 方案3:升级Aurora集群小版本
    你当前使用的Aurora PostgreSQL 13.6配套的是较早版本的Babelfish,后续发布的Babelfish更新版本已经修复了TDS协议下SCOPE_IDENTITY()返回值异常的问题,可以在业务维护窗口将Aurora集群升级到13.x大版本下的最新小版本,升级后无需修改业务代码即可解决该问题。
避坑提示

不要尝试在插入语句执行后单独执行SELECT SCOPE_IDENTITY()来获取主键,Babelfish的TDS协议下该函数在事务、批量插入场景下存在会话级ID错乱的问题,稳定性远低于上述三个方案。
如果使用方案1,传入的列名需要和表结构中的主键列名完全匹配,大小写敏感的库表配置下需要注意列名的大小写匹配。

内容的提问来源于stack exchange,提问作者Peter Tarlos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 15:27:18