Postgres UPSERT и номер SERIAL выпуска - PullRequest
0 голосов
/ 23 апреля 2019

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...