Re: Questions about SERIAL type

Поиск
Список
Период
Сортировка
От G. Anthony Reina
Тема Re: Questions about SERIAL type
Дата
Msg-id 3C056DD8.B4D32F1F@nsi.edu
обсуждение исходный текст
Ответ на Questions about SERIAL type  (reina@nsi.edu (Tony Reina))
Ответы Re: Questions about SERIAL type  (Ned Wolpert <ned.wolpert@knowledgenet.com>)
Список pgsql-hackers
Doug McNaught wrote:

> I don't think PG (or the SQL standard) has any concept of unsigned
> numbers.  Besides, you can have sequences that have negative values at
> some points, and even decrement rather than increment.  Some folks may
> rely on this behavior.

When I tried setting the current value to -200  I got an error that the
number was outside of the proper range.

db02=# create table test (id SERIAL);
NOTICE:  CREATE TABLE will create implicit sequence 'test_id_seq' for SERIAL
column 'test.id'
NOTICE:  CREATE TABLE/UNIQUE will create implicit index 'test_id_key' for
table 'test'
CREATE

db02=# select setval('test_id_seq', -200);
ERROR:  test_id_seq.setval: value -200 is out of bounds (1,2147483647)

So I'm not sure how people would be using negative values. It looks like from
the documentation that the SERIAL type always increments by 1 so I'm not sure
how they could use decrementing values. Unless, of course, they've changed
the source code to do this. Perhaps I'm missing something here in the
documentation (using PG 7.1.3, maybe 7.2beta has changed this?).


> How would this work?  Would the DB have to go through all tables
> looking for REFERENCES constraints and update those rows referring to
> a renumbered key?  What if you had a referencing column without a
> REFERENCES constraint?  What if you had some kind of data external to
> the database that relied on those primary keys staying the same?  Not
> practical IMHO.
>

Yes, it would have to do this which may be time consuming and possibly
impractical. However, the VACUUM ANALYZE is doing an aweful lot of processing
on the tables and the indicies already.

However, perhaps the other thing to do is to not increment the SERIAL value
on an aborted transaction. I'm not sure why serial has to be incremented if
the transaction fails. Of course, this won't take care of unused SERIAL
numbers when DELETEs occur.

I'm not sure about other database schemas which depend on the SERIAL values
remaining the same for external consistency. You could still use an OID in
that case I should think instead of SERIAL (?)

>
> > I figure that I should never reach 2^31 - 1 transaction per table even
> > with many aborted ones; however, I think these would be nice changes.
>
> What's going to happen AFAIK is that 64-bit sequences will be
> available.  It's unlikely that overflow will be an issue with
> those...  ;)
>

That will definitely make overflow unlikely. Perhaps I'm just being too
paranoid that somehow I'll get to the point where my SERIAL value is maxed
out but I have large gaps from DELETED/UPDATED/ABORTED transactions.

-Tony

db02=# select version();                          version
-------------------------------------------------------------PostgreSQL 7.1.3 on i686-pc-linux-gnu, compiled by GCC
2.96
(1 row)





В списке pgsql-hackers по дате отправления:

Предыдущее
От: Mårten Gustafsson
Дата:
Сообщение: Re: [GENERAL] Rules
Следующее
От: Ned Wolpert
Дата:
Сообщение: Re: Questions about SERIAL type