Сброс Postgres значение автоинкремента до 0 - PullRequest
1 голос
/ 26 мая 2020

У меня есть таблица, в которую я иногда вводю данные во встроенных редакторах, где я вручную добавляю значение id, которое обычно автоматически увеличивается.

В случае, когда id 4 был автоматически сгенерирован с использованием скриптов, а затем id 5 и 6 были добавлены в строку, всякий раз, когда я запускаю запрос на вставку, база данных пытается автоматически увеличить значение 4. Но значение 5 было добавлено в базу данных пользователем с помощью встроенного редактора. В таком случае я использовал сценарий, как показано ниже

SELECT SETVAL('<tableName>_id_seq', (SELECT MAX(id) FROM <tableName>));

Затем значение автоматического приращения присваивается максимальному значению идентификатора, которое в настоящее время содержит база данных, тем самым автоматически увеличиваясь для запросов вставки.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я очищаю базу данных, есть ли способ сбросить значение автоинкремента на 0 или что-то в этом роде, чтобы следующие запросы вставки начали вставку со значением 1 в столбец id?

Ответы [ 3 ]

1 голос
/ 26 мая 2020

Кажется, я нашел удобный ответ на свой вопрос

ALTER SEQUENCE <tableName>_id_seq RESTART;

Надеюсь, это поможет

1 голос
/ 26 мая 2020

Есть несколько способов сделать это, как описано выше, но если вам нужен более идемпотентный способ сделать это (что вы и делаете), я бы порекомендовал:

SELECT SETVAL('<tableName>_id_seq', COALESCE((SELECT MAX(id) FROM <tableName>),1));

Таким образом, вы можете использовать один и тот же код независимо от того, есть ли у вас строки в таблице или нет, и он будет действовать правильно.

1 голос
/ 26 мая 2020

Вот пример того, что я делаю в моем sql, чтобы перезапустить индекс из моей базы данных. Я использую этот код при сбросе объектов для модульного тестирования моего API.

В моей базе данных у меня есть таблица терминал :

CREATE TABLE IF NOT EXISTS terminal(
    id SERIAL PRIMARY KEY,
    "serialNumber" VARCHAR(255),
    "storeCode" VARCHAR(100),
    "modelCode" VARCHAR(31)
);

Он создаст таблицу с первичный ключ terminal_id_seq.

ALTER SEQUENCE terminal_id_seq RESTART WITH 1;
DELETE FROM terminal;
--redo the inserts
INSERT INTO terminal ("id", "serialNumber", "storeCode","modelCode") VALUES (10,'abc','def','blabla');

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...