我需要UPSERT
Postgres 中的功能。由于 Postgres 本身不支持此功能,因此我编写了一个函数来执行此操作(尝试更新,如果没有更新行,则插入)
这是函数的模板:https ://stackoverflow.com/a/1109198/681671
CREATE FUNCTION merge_db(key INT, data TEXT) RETURNS VOID AS
$$
BEGIN
LOOP
-- first try to update the key
UPDATE db SET b = data WHERE a = key;
IF found THEN
RETURN;
END IF;
-- not there, so try to insert the key
-- if someone else inserts the same key concurrently,
-- we could get a unique-key failure
BEGIN
INSERT INTO db(a,b) VALUES (key, data);
RETURN;
EXCEPTION WHEN unique_violation THEN
-- do nothing, and loop to try the UPDATE again
END;
END LOOP;
END;
$$
LANGUAGE plpgsql;
SELECT merge_db(1, 'david');
我正在使用 Spring JDBC 模板。这个选择语句(以其参数化形式)和一个对象数组是我传递给 JDBCTemplate 的 batchUpdate 方法的。
我得到这个例外:
org.postgresql.util.PSQLException: A result was returned when none was expected.
我怀疑这是因为使用SELECT
.
我知道我可以在循环中使用 Callable ,但这会使应用程序变得非常健谈,并且 I/O 延迟会使其非常慢。
如何使用 Spring JDBC / raw JDBC 在 Postgres 中完成批量更新插入?
我正在使用 Postgresql 9.1。