JDBC允许我们使用以下语法获取数据库自动生成的主键的值(例如IDENTITYAUTO_INCREMENT):

PreparedStatement ps= connection.prepareStatement(
    "INSERT INTO post (title) VALUES (?)",
     Statement.RETURN_GENERATED_KEYS
);

while (resultSet.next()) {
    LOGGER.info("Generated identifier: {}", resultSet.getLong(1));
}

我感兴趣的是Oracle、SQL Server、postgresQL或MySQL驱动程序是否使用单独的往返来获取标识符,或者是否有一个单独的往返来执行插入并自动获取ResultSet

最佳答案

在带有PgJDBC的PostgreSQL中,没有额外的往返过程来获取生成的密钥。
它发送一个Parse/descripe/Bind/Execute消息序列,然后同步,然后读取结果,包括返回的结果集。因为协议管道请求,所以只需要一个客户机/服务器往返。
但是,有时可以流式传输到服务器的批可能会被分解成更小的块,或者在请求生成的密钥时逐个运行。要避免这种情况,请使用String[]数组表单,在其中命名要返回的列,并仅命名固定宽度数据类型的列,如integer。这只对批次和it's a due to a design problem in PgJDBC有影响。
(我发布的a patch to add batch pipelining support in libpq没有这个限制,它将对具有任意大小结果的任意大小的批处理执行一次客户机/服务器往返,包括返回密钥。)

关于mysql - Statement.RETURN_GENERATED_KEYS是否会生成任何额外的往返行程以获取新创建的标识符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38006260/

10-10 14:59