5.10. Tipos identificadores de objetos

Os identificadores de objeto (OIDs) são utilizados internamente pelo PostgreSQL como chaves primárias para várias tabelas do sistema. Além disso, uma coluna do sistema OID é adicionada às tabelas criadas pelo usuário (a não ser que WITHOUT OIDS seja especificado na criação da tabela). O tipo oid representa um identificador de objeto. Também existem diversos aliases para oid: regproc, regprocedure, regoper, regoperator, regclass, e regtype. A tabela Tabela 5-20 mostra uma visão geral.

O tipo oid é implementado atualmente como inteiro de quatro bytes sem sinal. Portanto, não é grande o suficiente para fornecer unicidade para todo o banco de dados em bancos de dados grandes, ou mesmo em tabelas individuais grandes. Por isso, a utilização de uma coluna OID criada pelo usuário como chave primária é desencorajada. Os OIDs são melhor usados somente para referências às tabelas do sistema.

O tipo oid possui poucas operações próprias além da comparação (a qual é implementada utilizando a comparação sem sinal). Pode, entretanto, ser transformado em inteiro e, então, manipulado utilizando os operadores padrão para inteiros (Tome cuidado com as possíveis confusões entre inteiros com sinal e sem sinal se isto for feito).

Os tipos aliases de oid não possuem operações próprias com exceção de rotinas de entrada e saída especializadas. Estas rotinas são capazes de aceitar e mostrar nomes simbólicos para objetos do sistema, em vez do valor numérico puro e simples que o tipo oid usaria. Os tipos aliases permitem uma visão simplificada dos valores de OID para os objetos: por exemplo, pode ser escrito 'minha_tabela'::regclass para obter o OID da tabela minha_tabela, em vez de SELECT oid FROM pg_class WHERE relname = 'minha_tabela' (Na verdade, um comando SELECT muito mais complicado é necessário para obter o OID correto quando existem diversas tabelas com o nome minha_tabela em esquemas diferentes).

Tabela 5-20. Tipos identificadores de objetos

Nome do tipoReferenciaDescriçãoExemplo de valor
oidqualquer umidentificador numérico de objeto564182
regprocpg_procnome de funçãosum
regprocedurepg_procfunção com tipos dos argumentossum(int4)
regoperpg_operatornome de operador+
regoperatorpg_operatoroperador com tipos dos argumentos*(integer,integer) ou -(NONE,integer)
regclasspg_classnome da relaçãopg_type
regtypepg_typenome de tipointeger

Todos os tipos aliases de OID aceitam nomes qualificados pelo esquema, e mostram nomes qualificados pelo esquema na saída se o objeto não for encontrado no caminho de procura corrente sem que esteja qualificado. Os tipos aliases regproc e regoper somente aceitam a entrada de nomes únicos (não sobrecarregados), sendo portanto de uso limitado; para a maioria dos casos regprocedure e regoperator são mais apropriados. Em regoperator, os operadores unários são identificados escrevendo NONE no lugar do operando não utilizado.

Os OIDs são quantidades de 32 bits atribuídas a partir de um único contador para todo o agrupamento de bancos de dados. Em um banco de dados grande, ou de longa duração, é possível o contador reiniciar. Portanto, não é boa prática supor que os OID são únicos, a não ser que sejam tomadas medidas para garantir que sejam realmente únicos. Uma prática recomendada na utilização de OIDs como identificador de linhas é a criação de uma restrição de unicidade na coluna OID de cada tabela onde OID for utilizado. Nunca deve ser suposto que os OID são únicos entre tabelas; utilize a combinação de tableoid com OID da linha se for necessário criar um identificador único para todo o banco de dados (Nas versões futuras do PostgreSQL é possível que venha a ser utilizado um contador OID separado para cada tabela, fazendo com que tableoid deva ser incluído para obter um identificador único global).

Um outro tipo identificador utilizado pelo sistema é xid, ou identificador de transação (abreviada como xact). Este é o tipo de dado das colunas do sistema xmin e xmax. Os identificadores de transação são quantidades de 32 bits. Em um banco de dados de longa duração é possível que os identificadores de transação reiniciem. Isto não é um problema fatal devido aos procedimentos apropriados de manutenção; consulte o Guia do Administrador do PostgreSQL para ver os detalhes. Entretanto, não é sensato depender da unicidade do identificador de transação por muito tempo (mais de um bilhão de transações).

Um terceiro tipo de identificador utilizado pelo sistema é o cid, ou identificador de comando. Este é o tipo de dado das colunas do sistema cmin e cmax. Os identificadores de comando também são quantidades de 32 bits. Isto cria um limite de 232 (4 bilhões) de comandos SQL dentro de uma única transação. Na prática este limite não é um problema --- observe que este número é o limite de comandos SQL e não o número de tuplas processadas.

O último tipo de identificador utilizado pelo sistema é o tid, ou identificador de tupla. Este é o tipo de dado da coluna do sistema ctid. O identificador de tupla é o par (número do bloco, índice da tupla no bloco) que identifica a localização física da tupla dentro da tabela.