Страница 1 из 1

postgresql, инкремент поля serial

Добавлено: 2013-12-24 18:15:52
Zedik
увеличивается поле id типа serial, хотя запись и не добавляется (duplicate key value violates unique constraint), таким образом следующая уникальная запись попавшая в таблицу будет иметь id не на единицу больше от предыдущего, а намного большее значение.
Подскажите пож-та, что нужно подправить.
Таблицу создаю так:

Код: Выделить всё

CREATE TABLE IF NOT EXISTS table_name (
id serial primary key NOT NULL,
name varchar(128) NOT NULL,
bid varchar(128) NOT NULL
);
CREATE UNIQUE INDEX ibo ON table_name  (name,bid);

Re: postgresql, инкремент поля serial

Добавлено: 2013-12-25 16:41:33
ChihPih
А каким запросом записи добавляете?

Re: postgresql, инкремент поля serial

Добавлено: 2013-12-26 5:39:40
Zedik
Просто инсертом

Код: Выделить всё

INSERT INTO table_name (bid,name) VALUES ('$bid','$name')";

Re: postgresql, инкремент поля serial

Добавлено: 2014-04-02 11:03:06
filier
http://dba.stackexchange.com/questions/ ... nserted-id

select nextval increase serial by 1 position each time

Re: postgresql, инкремент поля serial

Добавлено: 2014-04-27 10:35:37
balex
Проблема то у чловека не в том чтобы на 1 увеличить, это и сам постгрес умеет. Проблема в "дырках" в первичном ключе после отказов при записи в таблицу, и в данном примере отказ из-за нарушения уникальности в полях name и bid. С этим трудно что то поделать, ибо даже Oracle дырки может оставлять. Можно посоветовать не использовать serial а использовать свою функцию ищущую первый свободный id, но при этом прийдется лочить таблицу что снизит производительность. Если таблица опорная для толпы других таблиц по вторичному ключу и интенчивно запись в нее не делается, это имеет смысл. В противном случае лучше смириться - оптимизатор сам сделает выводы о том как ему хранить "дырявый" индекс. Логика софта естественна ни вкоем случае не должна "предполагать" о порядке следования данных в первичном ключе.