I am using postgresql, and was wondering how large
id INTEGER PRIMARY KEY
can get compared to
id SERIAL PRIMARY KEY
Here is a handy chart for PostgreSQL:
Name Storage Size Description Range
smallint 2 bytes small-range integer -32768 to +32767
integer 4 bytes usual choice for integer -2147483648 to +2147483647
bigint 8 bytes large-range integer -9223372036854775808 to 9223372036854775807
serial 4 bytes autoincrementing integer 1 to 2147483647
bigserial 8 bytes large autoincrementing integer 1 to 9223372036854775807
Source
Your assessment is right, you'd run out of unique ID's if you used a data type that was insufficient.
The data types smallserial, serial and bigserial are not true types, but merely a notational convenience for creating unique identifier columns (similar to the AUTO_INCREMENT property supported by some other databases)
A bigserial
is 8 bytes long. If that is not enough it is possible to use the 128 bits uuid:
create table t (
id uuid primary key
);
insert into t (id)
select uuid_generate_v1mc();
select * from t;
id
--------------------------------------
916bf7e6-f0c2-11e2-8d14-d372d5ab075f
The uuid_generate_v1mc
function is provided by the uuid-ossp module
The main advantage of the uuid functions is that they generate an id that is very likely to be unique among different systems. A serial
will have collisions between those systems.