首页 > 解决方案 > Postgres UPSERT 和 id SERIAL 问题

问题描述

创建表:

CREATE TABLE tests (id SERIAL PRIMARY KEY, "name" VARCHAR);

UPSERT:

INSERT INTO tests (id, "name") 
VALUES (?, ?)
ON CONFLICT (id) DO UPDATE 
SET "name" = EXCLUDED."name";

问题是它从不执行 UPDATE 部分,因为 SERIAL 类型解决了所有冲突 - 它只是将现有记录插入为具有新 id (nextval) 的新记录,而不是更新它们。

我正在尝试实现“保存所有记录”功能。如果它们不存在,它应该更新现有记录并插入新记录。

我想象的算法:

connection.setAutoCommit(false);

for (Test test : tests)
{
    statement = connection.prepareStatement("INSERT INTO tests (id, \"name\") VALUES (?, ?) ON CONFLICT (id) DO UPDATE  SET \"name\" = EXCLUDED.\"name\";");
    statement.setInt(1, test.getId());
    statement.setString(2, test.getName());
    statement.execute();
}

connection.commit();

标签: javasqlpostgresqljdbc

解决方案


推荐阅读