Postgresql устанавливает следующий идентификатор для записи в - PullRequest
5 голосов
/ 03 ноября 2011

Я недавно перенес базу данных из mysql в pgsql 9.

Но теперь, когда я пытаюсь создать новый объект (в администраторе django), он сообщает мне, что идентификатор, который я пытаюсь использовать (начинался с единицы и увеличивался при каждой попытке), уже используется.

Я предполагаю, что существует указатель или индекс, который должен быть установлен на последний использованный идентификатор. Я прав?

Ответы [ 2 ]

7 голосов
/ 03 ноября 2011

Когда вы определяете свою таблицу, PostgreSQL эквивалентен 'auto_increment':

CREATE TABLE foo (
    id    SERIAL,
    ...
);

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

CREATE SEQUENCE foo_id_seq;
ALTER TABLE foo ALTER COLUMN id SET DEFAULT nextval('foo_id_seq');

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

<table name>_<column name>_seq

Таким образом, в моем примере, foo_id_seq.

2 голосов
/ 03 ноября 2011

Если таблица была перенесена и использует последовательный интерфейс для замены столбца автоинкремента mysql, ваши данные, вероятно, были перенесены без увеличения последовательной последовательности. Найдите функцию postgresql setval, чтобы установить для последовательности значение, превышающее максимальный существующий ключ в вашей таблице.

...