Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Definizione dei dati > Colonne di Sistema
PrecedenteVincoliModifica di TabelleSuccessivo

5.4. Colonne di Sistema

Ogni tabella ha diverse colonne di sistema che sono definite implicitamente dal sistema. Perciò, questi nomi non possono essere usati come nomi di colonne definiti dall'utente. (Notare che queste restrizioni non riguardano se il nome è una parola chiave o no; mettere il nome tra parentesi non ti permetterà di scavalcare queste restrizioni.) Non preoccuparsi di queste colonne; Basta sapere che esistono.

oid

L'identificatore oggetto (OID oggetto) di una riga. Questa colonna è presente solo se la tabella è stata creata usando WITH OIDS, o se la variabile di configurazione default_with_oids è settata al momento della creazione della tabella. Questa colonna è del tipo oid (stesso nome della colonna); vedi Sezione 8.16, «Tipi identificatori di oggetto» per maggiori informazioni sul tipo..

tableoid

L'OID della tabella contenente questa riga. Questa colonna è particolarmente utile per query che selezionano da gerarchie di ereditarietà (see Sezione 5.8, «Ereditarietà»), dato che senza essa, è difficile dire da quale tabella proviene una riga. Il tableoid può essere unito con la colonna oid di pg_class per ottenere il nome della tabella.

xmin

L'identificatore (ID transazione) della transazione di inserimento per l'attuale versione della riga. (Una versione di riga è lo stato individuale di una riga); Ogni aggiornamento di una riga crea una nuova versione di riga per la stessa riga logica.

cmin

L'identificatore di comando (partendo da zero) all'interno della transazione di inserimento.

xmax

L'identificatore (ID transazione) della transazione di cancellazione, o zero per una riga non cancellata. Per questa colonna è possibile essere non-zero in una versione di riga visibile. Questo di solito indica che la transazione di cancellazione non è stata ancora eseguita, o che è stato fatto un rollback su un tentativo di cancellazione.

cmax

L'identificatore di comando all'interno della transazione di cancellazione, o zero.

ctid

La locazione fisica della versione di riga all'interno della sua tabella. Notare che sebbene ctid può essere usato per localizzare la versione di riga molto velocemente, il ctid di una riga cambierà se la riga viene aggiornata o mossa dal VACUUM FULL. Perciò ctid è inutile come identificatore di riga a lungo-termine. L'OID, od ancora meglio un numero di serie definito dall'utente, dovrebbero essere usati per identificare le righe.

Gli OID sono quantità a 32-bit, assegnati da un singolo contatore per cluster. In un database grande o vecchio, è possibile che il contatore si inceppi. Quindi, è una cattiva abitudine assumere che gli OID siano unici, a meno che tu non faccia qualcosa per assicurartene. Se hai bisogno di identificare le righe una tabella, l'uso di un generatore di sequence è fortemente raccomandato. Comunque, anche gli OID possono essere usati, se vengono prese alcune precauzioni addizionali:

  • Un vincolo unique dovrebbe essere creato sulla colonna OID di ogni tabella in cui l'OID sarà usato per identificare le righe. Quando un vincolo unique (o un indice unico) esistono, il sistema si prende cura di non generare un OID che sia uguale ad una riga già esistente. (Ovviamente, questo è possibile solo se la tabella contiene meno di 232 (4 bilioni) di righe, e in pratica la dimensione di una tabella dovrebbe essere molto meno di così, o le prestazioni potrebbero risentirne.)

  • Gli OID non dovrebbero mai essere considerati unici attraverso le tabelle; Usa la combinazione di tableoid e l'OID della riga se hai bisogno di un identificatore attraverso il database.

  • Certamente, le tabelle in questione devono essere create WITH OIDS. Da PostgreSQL™ 8.1, WITHOUT OIDS è il default.

Anche gli identificatori di transazione sono a 32-bit. In un database vissuto è possibile che gli ID di transazione si inceppino. Questo non è un problema fatale se usate procedure di manutenzione appropriate; vedi Capitolo 23, Routine Database Maintenance Tasks per maggiori dettagli. Non è consigliabile, comunque, contare sull'unicità degli ID di transazione per il lungo periodo (più di un bilione di transazioni).

Anche gli identificatori di comando sono quantità a 32-bit. Questo crea un forte limite di 232 (4 bilioni) di comandi SQL dentro una singola transazione. In pratica questo limite non è un problema -- note che il limite è sul numero di comandi SQL, non il numero di righe processate. Inoltre, da PostgreSQL™ 8.3, solo i comandi che realmente modificano il contenuto del database consumeranno un identificatore di comando.

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Definizione dei dati > Colonne di Sistema
PrecedenteVincoliModifica di TabelleSuccessivo