5.3. Colunas de identidade #

Uma coluna de identidade é uma coluna especial gerada automaticamente a partir de uma sequência implícita. Ela pode ser usada para gerar valores-chave.

Para criar uma coluna de identidade, use a cláusula GENERATED ... AS IDENTITY do comando CREATE TABLE, como, por exemplo:

CREATE TABLE pessoa (
    id bigint GENERATED ALWAYS AS IDENTITY,
    ...,
);

ou, de forma alternativa,

CREATE TABLE pessoa (
    id bigint GENERATED BY DEFAULT AS IDENTITY,
    ...,
);

Veja CREATE TABLE para obter mais detalhes.

Se for executado um comando INSERT numa tabela com coluna de identidade e não for especificado explicitamente nenhum valor para a coluna de identidade, será inserido um valor gerado pela sequência implícita. Por exemplo, com as definições acima e assumindo colunas adicionais apropriadas, executando

INSERT INTO pessoa (nome, endereço) VALUES ('A', 'foo');
INSERT INTO pessoa (nome, endereço) VALUES ('B', 'bar');

iria gerar valores para a coluna id começando em 1, resultando nos seguintes dados para a tabela:

 id | nome | endereço
----+------+----------
  1 | A    | foo
  2 | B    | bar
(2 linhas)

Como alternativa, pode ser especificada a palavra-chave DEFAULT no lugar do valor para solicitar explicitamente o valor gerado pela sequência, como, por exemplo:

INSERT INTO pessoa (id, nome, endereço) VALUES (DEFAULT, 'C', 'baz');

Da mesma forma, pode ser usada a palavra-chave DEFAULT em comandos UPDATE.

Assim sendo, em muitos aspectos uma coluna de identidade se comporta como uma coluna com valor padrão.

As cláusulas ALWAYS e BY DEFAULT na definição da coluna determinam como os valores especificados explicitamente pelo usuário serão tratados pelos comandos INSERT e UPDATE. Em um comando INSERT, se estiver especificado ALWAYS na definição da coluna um valor especificado pelo usuário só será aceito se o comando INSERT especificar OVERRIDING SYSTEM VALUE. Se estiver especificado BY DEFAULT na definição da coluna, então o valor especificado pelo usuário terá precedência. Então, usar BY DEFAULT resulta em um comportamento mais semelhante ao de um valor padrão onde o valor padrão pode ser substituído por um valor explícito, enquanto ALWAYS oferece uma proteção adicional contra a inserção acidental de um valor explícito.

O tipo de dados de uma coluna de identidade deve ser um dos tipos de dados aceitos por sequências (veja CREATE SEQUENCE). Podem ser especificadas as propriedades da sequência associada ao se criar uma coluna de identidade (veja CREATE TABLE), ou alteradas depois (veja ALTER TABLE).

Uma coluna de identidade é automaticamente marcada como NOT NULL. Entretanto, uma coluna de identidade não garante a unicidade. (Normalmente uma sequência retorna valores únicos, mas uma sequência pode ser reiniciada ou podem ser inseridos valores manualmente na coluna de identidade, conforme discutido acima.) A unicidade precisa ser garantida por meio de uma restrição PRIMARY KEY ou UNIQUE.

Em hierarquias de herança de tabelas, as colunas de identidade e suas propriedades na tabela filha são independentes daquelas de suas tabelas mães. Uma tabela filha não herda automaticamente as colunas de identidade ou suas propriedades da tabela mãe. Em um comando INSERT ou UPDATE, uma coluna será tratada como coluna de identidade se esta coluna também for uma coluna de identidade na tabela especificada no comando, e estiverem aplicadas as propriedades de identidade correspondentes.

As partições herdam as colunas de identidade da tabela particionada. Elas não podem ter suas próprias colunas de identidade. As propriedades de uma determinada coluna de identidade são consistentes em todas as partições da hierarquia de partições.