tl;dr
Agora no Postgres 10, especifique
GENERATED BY DEFAULT AS IDENTITY
pelo padrão SQL. create table tower
(
npages integer,
ifnds integer,
ifnid integer,
name varchar(20),
towid integer GENERATED BY DEFAULT AS IDENTITY -- per SQL standard
)
Coluna de identidade
O Postgres 10 agora suporta o conceito de coluna de identidade e usa a sintaxe SQL padrão. Embora não seja especialista em MS SQL Server, acredito que esse novo suporte padrão seja equivalente.
GERADO … COMO IDENTIDADE
O
GERADO … COMO IDENTIDADE
comando usado durante CREATE TABLE
cria uma sequência implícita. A criação, nomeação, permissões e descarte dessa sequência são transparentes para você, ao contrário de SERIAL
. Muito intuitivo agora. Se você conceder uma permissão de uso à tabela, eles obterão permissão para a sequência. Se você descartar a tabela, a sequência será descartada automaticamente. Dois sabores da sintaxe padrão. A diferença importa apenas se você passar um valor em vez de deixar um valor ser gerado. Normalmente, as pessoas sempre confiam no valor gerado, então normalmente você usaria simplesmente a primeira versão,
GENERATED BY DEFAULT AS IDENTITY
. GERADO POR PADRÃO COMO IDENTIDADE
- Gera um valor, a menos que
INSERT
comando fornece um valor.
- Gera um valor, a menos que
GERADO SEMPRE COMO IDENTIDADE
- Ignora qualquer valor fornecido por
INSERT
a menos que especifiqueOVERRIDING SYSTEM VALUE
- Ignora qualquer valor fornecido por
Consulte o
CREATE TABLE
página para documentação. Leia esta página interessante por Peter Eisentraut. Ele explica alguns problemas estranhos com
SERIAL
. Nenhum desses problemas com o novo recurso de coluna de identidade. Portanto, não há motivo para usar SERIAL
mais, sem desvantagens, apenas vantagens; SÉRIE
é suplantado por GENERATED … AS IDENTITY
. Observe que uma coluna de identidade não é necessariamente uma chave primária e não é indexada automaticamente. Portanto, você ainda precisa especificar
PRIMARY KEY
explicitamente se essa for sua intenção (como seria o caso normalmente). CREATE TABLE person_ (
id_
INTEGER
GENERATED BY DEFAULT AS IDENTITY -- Replaces SERIAL. Implicitly creates a SEQUENCE, specified as DEFAULT.
PRIMARY KEY -- Creates index. Specifies UNIQUE. Marks column for relationships.
,
name_
VARCHAR( 80 )
) ;
A intenção é que os detalhes da implementação interna sejam ocultados de você. Não há necessidade de você saber o nome da sequência que está sendo gerada secretamente. Por exemplo, você pode redefinir o contador por meio da coluna sem conhecer a sequência subjacente.
ALTER TABLE person_
ALTER COLUMN id_
RESTART WITH 1000 -- Reset sequence implicitly, without a name.
;
Especificando a identidade implicitamente:
- Marca a coluna
NOT NULL
- Cria uma sequência
- O tipo de sequência corresponde à coluna (32 bits, 64 bits etc.)
- Ata a sequência à coluna
- Herda permissões
- Cascando em cascata
- Permanece vinculado à coluna mesmo se a coluna for renomeada
- Especifica a sequência como fonte de valores padrão para essa coluna
A coluna de identidade pode ter as mesmas opções que
CREATE SEQUENCE
:COMECE COM início
MINVALUE minvalue
|NO MINVALUE
MAXVALUE maxvalue
|SEM MAXVALUE
INCREMENT [ BY ] incremento
CICLO
|SEM CICLO
CACHE
cachePROPRIEDADE DE NENHUMA
( especificar a propriedade para a coluna de identidade não faz sentido para mim, pois a propriedade é gerenciada automaticamente)
Exemplo bobo de opções:
id_ INTEGER
GENERATED BY DEFAULT AS IDENTITY (
START WITH 200
MINVALUE 100
MAXVALUE 205
CYCLE
INCREMENT BY 3
) PRIMARY KEY
Adicionando 4 linhas: