【发布时间】:2013-04-13 17:03:39
【问题描述】:
这是有效的代码:
Connection c = ds.getConnection();
c.setAutoCommit(false);
PreparedStatement stmt = c.prepareStatement("INSERT INTO items (name, description) VALUES(?, ?)");
while (!(items = bus.take()).isEmpty()) {
for (Item item : items) {
stmt.setString(1, item.name);
stmt.setString(2, item.description);
stmt.addBatch();
}
stmt.executeBatch();
c.commit();
}
但是现在我需要填充另一个表,其中 id 是外键。
如果我将 INSERT 与 RETURNING id 一起使用,则 executeBatch 将失败,并出现“预期没有结果时返回结果”错误。
我看到了几种解决方法
- 单独插入而不是批量插入。
- 将序列号替换为客户端生成的 guid。
- 使用某种存储过程来执行批量插入并返回 ID 列表。
在我看到的三种方法中,最后一种似乎既保留了批量插入的效率又保留了返回 id,但它对我来说也是最复杂的,因为我从未编写过存储过程。
有没有更好的方法来批量插入和获取 ID?我使用 postgresql 特定的 API 而不是 jdbc 没有问题。
如果没有,任何人都可以画出这样的存储过程吗?
这是表架构:
CREATE UNLOGGED TABLE items
(
id serial,
name character varying(1000),
description character varying(10000)
)
WITH (
OIDS=FALSE
);
【问题讨论】:
-
看看 JDBC
getGeneratedKeys方法。不过,我还没有专门验证它是否适用于批量连接。 -
用 wCTE 一次填充两个表怎么样?
-
@JakubKania - wCTE 是什么?你能举个例子吗?
-
@mark 一个可写的 CTE,它可以让你像这样链接查询。看这里:depesz.com/2011/03/16/waiting-for-9-1-writable-cte 这是 9.1+ 的功能。
-
@mark 对此有何更新?
标签: java postgresql jdbc batch-file