CREATE TABLE:
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 разрешает все конфликты - он просто вставляет существующие записи как новыезаписи с новыми идентификаторами (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();