Подтвердить что ты не робот

Автоинкремент postgres не обновляется при явных вводах id

У меня есть следующая таблица в postgres:

CREATE TABLE "test" (
    "id" serial NOT NULL PRIMARY KEY,
    "value" text
)

Я делаю следующие вставки:

insert into test (id, value) values (1, 'alpha')
insert into test (id, value) values (2, 'beta')

insert into test (value) values ('gamma')

В первых двух вставках я явно упоминаю id. Однако в этом случае указатель автоматического увеличения указателя таблицы не обновляется. Следовательно, в третьей вставке я получаю ошибку:

ERROR:  duplicate key value violates unique constraint "test_pkey"
DETAIL:  Key (id)=(1) already exists.

Я никогда не сталкивался с этой проблемой в Mysql в обоих системах MyISAM и INNODB. Явным или нет, mysql всегда обновляет указатель автоинкремента на основе максимального идентификатора строки.

Каков обходной путь для этой проблемы в postgres? Мне нужно это, потому что я хочу более жесткий контроль над некоторыми идентификаторами в моей таблице.

UPDATE: Мне это нужно, потому что для некоторых значений мне нужен фиксированный идентификатор. Для других новых записей я не возражаю против создания новых.

Я думаю, что это может быть возможно, если вручную указать указатель nextval на max(id) + 1, когда я явно вставляю идентификаторы. Но я не уверен, как это сделать.

4b9b3361

Ответ 1

То, как он должен работать - next_val('test_id_seq') вызывается только тогда, когда системе требуется значение для этого столбца, и вы его не указали. Если вы предоставляете значение, такой вызов не выполняется, и, следовательно, последовательность не обновляется.

Вы можете обойти это вручную значение для последовательности после последней вставки с явно указанными значениями:

SELECT setval('test_id_seq', (SELECT MAX(id) from "test"));