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.