2013-07-19 8 views
9

Sto usando PostgreSQL, e si chiedeva quanto grandeQuanto grande può un id entrare in PostgreSQL

id INTEGER PRIMARY KEY 

può ottenere rispetto al

id SERIAL PRIMARY KEY 

in Java un int è di 4 byte (32 bit) quindi può arrivare fino a 2.147.483.647. È questo il caso di postgresql? Se così fosse, non posso superare 2.147.483.647 file?

+0

Ben risposto da @Goat CO, ma non si può essere disturbati a controllare i manuali in linea per i limiti di un tipo? Vi presento molti problemi per voi in futuro ... –

risposta

19

Ecco una tabella utile per 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

vostra valutazione è di destra, che ci si corto di ID univoci di se è stato utilizzato un tipo di dati che era insufficiente.

+1

.. ma se usate un 'bigint' (o' bigserial', che è la stessa cosa) [voi davvero, davvero non correrete] (http: //stackoverflow.com/questions/13132939/what-happens-when-i-exhaust-a-bigint-generated-key-how-to-handle-it/13133035#13133035). –

3

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)

Una bigserial è lunga 8 byte. Se questo non è sufficiente, è possibile utilizzare la 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 

La funzione uuid_generate_v1mc è fornito dal uuid-ossp module

Il vantaggio principale delle funzioni UUID è che essi generano un ID che è molto probabile che essere unico tra i diversi sistemi. Un serial avrà collisioni tra questi sistemi.

+0

E qui ho pensato che i trilioni di tabelle dei dischi con cui ho a che fare erano grandi, non posso immaginare di aver bisogno di più di nove quintilioni di ID. –

+1

Heh ... le persone hanno paura di esaurire una chiave 'bigint' [non hanno fatto i calcoli] (http://stackoverflow.com/questions/13132939/what-happens-when-i-exhaust-a-bigint- generato-chiave-how-to-handle-it/13133035 # 13133035). Le chiavi 'uuid' possono essere molto utili per i sistemi distribuiti ma non sono necessarie per i problemi di esaurimento delle chiavi. –

+0

@CraigRinger a causa del compleanno, il bigint può avere conflitti tra le chiavi molto prima che sia" esaurito ". Gli UUID hanno 128 bit per evitare questo problema. –