AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 122623
Accepted
Basil Bourque
Basil Bourque
Asked: 2015-12-02 17:33:25 +0800 CST2015-12-02 17:33:25 +0800 CST 2015-12-02 17:33:25 +0800 CST

Valor padrão para a coluna UUID no Postgres

  • 772

No Postgres 9.x, para uma coluna do tipo UUID, como especifico um UUID para ser gerado automaticamente como valor padrão para qualquer inserção de linha?

postgresql default-value
  • 3 3 respostas
  • 186300 Views

3 respostas

  • Voted
  1. Best Answer
    Basil Bourque
    2015-12-02T17:33:25+08:002015-12-02T17:33:25+08:00

    tl; dr

    Chame DEFAULTao definir uma coluna para invocar uma das funções uuid do OSSP . O servidor Postgres invocará automaticamente a função toda vez que uma linha for inserida.

    CREATE TABLE tbl 
    (
      pkey UUID NOT NULL DEFAULT uuid_generate_v1() , 
      CONSTRAINT pkey_tbl PRIMARY KEY ( pkey )
    )
    

    Se você já usa a extensão pgcrypto , considere a resposta por bpieck .

    Plugin necessário para gerar UUID

    Embora o Postgres pronto para uso suporte o armazenamento de valores UUID (Universally Unique Identifier) ​​em seu formato nativo de 128 bits , a geração de valores UUID requer um plug-in. No Postgres, um plug-in é conhecido como extension.

    Para instalar uma extensão, ligue para CREATE EXTENSION. Para evitar a reinstalação, adicione IF NOT EXISTS. Veja minha postagem no blog para obter mais detalhes ou consulte esta página no StackOverflow .

    A extensão que queremos é uma biblioteca de código aberto construída em C para trabalhar com UUIDs, OSSP uuid . Uma compilação dessa biblioteca para Postgres geralmente é empacotada com uma instalação do Postgres, como os instaladores gráficos fornecidos pelo Enterprise DB ou incluídos por provedores de nuvem, como Amazon RDS for PostgreSQL .

    CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
    

    Gerando vários tipos de UUID

    Consulte o documento da extensão para ver uma lista de vários comandos oferecidos para gerar vários tipos de valores UUID. Para obter a versão original do UUID criada a partir do endereço MAC do computador mais a data e hora atual mais um pequeno valor aleatório, chame uuid_generate_v1().

    SELECT uuid_generate_v1();
    

    672124b6-9894-11e5-be38-001d42e813fe

    Variações posteriores sobre este tema foram desenvolvidas para tipos alternativos de UUIDs. Algumas pessoas podem não querer registrar o endereço MAC real do servidor, por exemplo, por questões de segurança ou privacidade. A extensão Postgres gera cinco tipos de UUIDs, mais o UUID “nil” 00000000-0000-0000-0000-000000000000.

    UUID como valor padrão

    Essa chamada de método pode ser feita automaticamente para gerar um valor padrão para qualquer linha recém-inserida. Ao definir a coluna, especifique:

    DEFAULT uuid_generate_v1()

    Veja esse comando usado na definição de tabela de exemplo a seguir.

    CREATE TABLE public.pet_
    (
      species_ text NOT NULL,
      name_ text NOT NULL,
      date_of_birth_ text NOT NULL,
      uuid_ uuid NOT NULL DEFAULT uuid_generate_v1(),  -- <====
      CONSTRAINT pet_pkey_ PRIMARY KEY (uuid_)
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE public.pet_
      OWNER TO postgres;
    

    Versões de UUID

    O plugin uuid-ossp pode gerar várias versões do UUID .

    • uuid_generate_v1()
      Contém o endereço MAC do computador atual + momento atual. Comumente usado, mas evite se você for sensível em divulgar o MAC do seu servidor de banco de dados ou a hora em que esse valor foi gerado. Definido por especificação como um UUID da Versão 1 .
    • uuid_generate_v1mc()
      Como a versão 1 , mas com um endereço MAC multicast aleatório em vez do endereço MAC real. Aparentemente, uma maneira de usar a versão 1, mas substituindo outro MAC em vez do MAC real do seu servidor de banco de dados, se você for sensível em divulgar esse fato.
      O que é um 'MAC multicast aleatório'? Eu não sei exatamente . Depois de ler a seção 4.1.6 da RFC 4122 , eu suspeito que este é um número aleatório usado no lugar do MAC, mas com bits definidos para indicar um endereço MAC multicast em vez do unicast usual, de modo a distinguir esta variação da versão 1 de um usual real-MAC versão 1 UUID.
    • uuid_generate_v3( namespace uuid, name text )
      Contém um hash MD5 de texto que você fornece. Definido pela especificação como um UUID da Versão 3 , UUID baseado em namespace .
    • uuid_generate_v4()
      Baseado em dados gerados aleatoriamente para 121-122 dos 128 bits. Seis ou sete bits usados ​​para indicar Versão e Variante. Esse tipo de UUID só é prático se implementado com um gerador aleatório criptograficamente forte . Definido por especificação como um UUID da Versão 4 .
    • uuid_generate_v5( namespace uuid, name text )
      Igual à versão 3, mas usando hash SHA1 . Definido por especificação como Versão 5 UUID .
    • uuid_nil()
      Um caso especial, todos os bits definidos como zero 00000000-0000-0000-0000-000000000000. Usado como um sinalizador para um valor UUID desconhecido. Conhecido como um UUID nulo .

    Para comparar os tipos, consulte a pergunta, qual versão de UUID usar?

    Se você estiver interessado apenas na versão 4 (gerada aleatoriamente) e já estiver usando pgcrypto , veja a resposta por bpieck .

    Se você estiver curioso sobre as versões 3 e 5, consulte esta pergunta, Gerando o UUID v5. O que é nome e namespace? .

    Para obter mais discussões, consulte minha resposta a uma pergunta semelhante e meus valores UUID de postagem de blog de JDBC para Postgres .

    • 159
  2. bpieck
    2018-11-22T08:20:24+08:002018-11-22T08:20:24+08:00

    extensão pgcrypto

    Apenas uma pequena adição à resposta muito detalhada de Basil .

    Como atualmente a maioria está usando pgcrypto , em vez de uuid_generate_v4()você pode usar gen_random_uuid()um valor UUID da Versão 4 .

    Primeiro, habilite o pgcrypto no seu Postgres.

    CREATE EXTENSION "pgcrypto";
    

    Basta definir DEFAULT de uma coluna para

    DEFAULT gen_random_uuid()
    
    • 23
  3. Lukas Liesis
    2022-08-09T00:17:51+08:002022-08-09T00:17:51+08:00

    Se estiver usando o Postgres 14 ou mais recente, você não precisa de modificações ou plugins extras e pode apenas usargen_random_uuid()

    acabei de testar no AWS Aurora Serverless v2 padrão com Postgres v14

    ps, você pode ver que meu ID padrão é na verdade com prefixo wor-enquanto é o ID do espaço de trabalho. Eu adiciono prefixos a todas as tabelas para que quando recebo ID de qualquer lugar - logs, suporte, etc., posso dizer exatamente o que procurar.

    concat('wor-', gen_random_uuid())

    insira a descrição da imagem aqui

    insira a descrição da imagem aqui

    • 4

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve