Автоинкремент 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
, когда я явно вставляю идентификаторы. Но я не уверен, как это сделать.
Ответы
Ответ 1
То, как он должен работать - next_val('test_id_seq')
вызывается только тогда, когда системе требуется значение для этого столбца, и вы его не указали. Если вы предоставляете значение, такой вызов не выполняется, и, следовательно, последовательность не обновляется.
Вы можете обойти это вручную значение для последовательности после последней вставки с явно указанными значениями:
SELECT setval('test_id_seq', (SELECT MAX(id) from "test"));