PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como criar o equivalente da coluna de identidade de um SQL Server no Postgres

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.
  • GERADO SEMPRE COMO IDENTIDADE
    • Ignora qualquer valor fornecido por INSERT a menos que especifique OVERRIDING SYSTEM VALUE

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 cache
  • PROPRIEDADE 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: