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

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Zedik
сержант
Сообщения: 283
Зарегистрирован: 2007-01-20 22:30:57
Откуда: 127.0.0.1

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

Непрочитанное сообщение Zedik » 2013-12-24 18:15:52

увеличивается поле 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);

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2520 рублей (8 CPU, 8Gb RAM, 2x500Gb HDD, RAID 3ware 9750):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

ChihPih
ст. прапорщик
Сообщения: 566
Зарегистрирован: 2009-09-04 12:23:30
Откуда: Где-то в России...
Контактная информация:

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

Непрочитанное сообщение ChihPih » 2013-12-25 16:41:33

А каким запросом записи добавляете?
www.info-x.org - информационный ресурс о ОС FreeBSD.

Аватара пользователя
Zedik
сержант
Сообщения: 283
Зарегистрирован: 2007-01-20 22:30:57
Откуда: 127.0.0.1

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

Непрочитанное сообщение Zedik » 2013-12-26 5:39:40

Просто инсертом

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

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

filier
проходил мимо
Сообщения: 1
Зарегистрирован: 2009-10-21 22:15:51

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

Непрочитанное сообщение filier » 2014-04-02 11:03:06

http://dba.stackexchange.com/questions/ ... nserted-id

select nextval increase serial by 1 position each time

balex
проходил мимо

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

Непрочитанное сообщение balex » 2014-04-27 10:35:37

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