Существует одна вставки запрос с несколькими значениями (около 18k):множественная вставка с последовательностью проваливается в Postgres
INSERT INTO ENTRIES (ID, USER_ID)
VALUES (nextval('my_seq'), '233'),(nextval('my_seq'), '233');
Который уволен из LiquiBase ревизии в Java-приложениях:
JdbcConnection connection = (JdbcConnection) database.getConnection();
ResultSet resultSet = connection.prepareStatement("SELECT ID FROM USERS").executeQuery();
List<String> values = new ArrayList<>();
while (resultSet.next()) {
Long userId = resultSet.getLong(1);
for (int i = 0; i < 3; i++) {
values.add("(nextval('my_seq'), '" + userId + "')");
}
}
String sql = "INSERT INTO ENTRIES (ID, USER_ID) VALUES " + join(values, ",") + ";";
connection.createStatement().execute(sql);
Когда это выполненных против базы данных h2, все в порядке, но когда я запускаю это против postgres, возникает следующее исключение:
duplicate key value violates unique constraint "entries_pkey"
Как идентификатор из последовательности, используется повторно.
При запуске sql в pgAdmin все в порядке, но из приложения он терпит неудачу при первой вставке.
Моя первая мысль состоит в том, что, возможно, sql должен быть выполнен каким-то образом по-разному.
Любые мысли по этому поводу?
Вот описание таблицы:
CREATE TABLE entries
(
id bigint NOT NULL,
user_id bigint,
CONSTRAINT entries_pkey PRIMARY KEY (id),
CONSTRAINT fk_e3udjwux3ly7lu31huish0f82 FOREIGN KEY (user_id)
REFERENCES users (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE entries
OWNER TO app;
Можете ли вы опубликовать определение таблицы записей? – Patrick
Почему вы не используете значение по умолчанию для ID-поля? Пусть база данных обрабатывает приращения, и все в порядке, вам больше не нужно упоминать это поле в ваших инструкциях INSERT. –
@FrankHeikens при использовании nextval по умолчанию является той же ошибкой. – sandris