Minha pergunta é bastante simples. Estou ciente do conceito de um UUID e quero gerar um para se referir a cada 'item' de uma 'loja' no meu banco de dados com. Parece razoável, certo?
O problema é que a seguinte linha retorna um erro:
honeydb=# insert into items values(
uuid_generate_v4(), 54.321, 31, 'desc 1', 31.94);
ERROR: function uuid_generate_v4() does not exist
LINE 2: uuid_generate_v4(), 54.321, 31, 'desc 1', 31.94);
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Eu li a página em: http://www.postgresql.org/docs/current/static/uuid-ossp.html
Estou executando o Postgres 8.4 no Ubuntu 10.04 x64.
postgresql
uuid
postgresql-8.4
anon58192932
fonte
fonte
select dbo.uuid_generate_v4()
Respostas:
uuid-ossp
é um módulo contrib, portanto, não é carregado no servidor por padrão. Você deve carregá-lo no seu banco de dados para usá-lo.Para versões modernas do PostgreSQL (9.1 e mais recente), é fácil:
mas para 9.0 e abaixo, você deve executar o script SQL para carregar a extensão. Veja a documentação dos módulos contrib na 8.4 .
Para a página 9.1 e mais recente, leia os documentos de contribuição atuais e
CREATE EXTENSION
. Esses recursos não existem nas versões 9.0 ou anteriores, como a 8.4.Se você estiver usando uma versão empacotada do PostgreSQL, poderá ser necessário instalar um pacote separado contendo os módulos e extensões do contrib. Pesquise no banco de dados do gerenciador de pacotes por 'postgres' e 'contrib'.
fonte
apt-get install postgresql-contrib
ou algo semelhante. Tenteapt-cache search postgresql |grep contrib
encontrar o nome do pacote que você deseja.postgresql-contrib
pacote, receberá o erro: ERRO: não foi possível abrir o arquivo de controle de extensão "/usr/share/postgresql/9.3/extension/uuid-ossp.control": esse arquivo ou diretório não existeSem extensões (fraude)
(funciona pelo menos em 8.4)
clock_timestamp()
explicação.Se você precisar de um UUID v4 válido
* Agradecimentos a @Denis Stafichuk @Karsten e @autronix
Além disso, no Postgres moderno, você pode simplesmente transmitir:
SELECT md5(random()::text || clock_timestamp()::text)::uuid
fonte
uuid_in(md5(random()::text || now()::text)::cstring);
uuid-ossp
, mas estou trabalhando, por exemplo, em uma instância do PostgreSQL em que não tenho privilégios suficientes para instalar uma extensão.clock_timestamp()
é a melhor alternativa em ambos os casos para isso. Diferentenow()
ouCURRENT_TIMESTAMP
é volátil e retorna a hora atual real.SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);
Além disso, no Postgres moderno, você pode simplesmente lançar:SELECT md5(random()::text || clock_timestamp()::text)::uuid
- não há necessidade de mais mágica. Caso de uso: stackoverflow.com/a/8335376/939860select overlay(overlay(md5(random()::text || ':' || clock_timestamp()::text) placing '4' from 13) placing '8' from 17)::uuid;
A resposta de Craig Ringer está correta. Aqui está um pouco mais de informação para o Postgres 9.1 e posterior ...
A extensão está disponível?
Você só pode instalar uma extensão se ela já tiver sido criada para a instalação do Postgres (seu cluster no jargão do Postgres). Por exemplo, eu achei a extensão uuid-ossp incluída como parte do instalador do Mac OS X, gentilmente fornecido pelo EnterpriseDB.com. Qualquer uma das dezenas de extensões pode estar disponível.
Para verificar se a extensão uuid-ossp está disponível no cluster do Postgres, execute este SQL para consultar o
pg_available_extensions
catálogo do sistema:Instalar extensão
Para instalar essa extensão relacionada ao UUID , use o comando CREATE EXTENSION conforme visto neste SQL:
Cuidado: achei que os caracteres de MARCAÇÃO DE COTAÇÃO em torno do nome da extensão eram necessários, apesar da documentação em contrário.
O comitê de padrões SQL ou a equipe do Postgres escolheu um nome estranho para esse comando. Na minha opinião, eles deveriam ter escolhido algo como "INSTALAR EXTENSÃO" ou "USAR EXTENSÃO".
Verificar instalação
Você pode verificar se a extensão foi instalada com sucesso no banco de dados desejado executando este SQL para consultar o
pg_extension
catálogo do sistema:UUID como valor padrão
Para obter mais informações, consulte a pergunta: Valor padrão para a coluna UUID no Postgres
O Caminho Antigo
As informações acima usam o novo recurso Extensões adicionado ao Postgres 9.1. Nas versões anteriores, tivemos que encontrar e executar um script em um arquivo .sql . O recurso Extensões foi adicionado para facilitar a instalação, negociando um pouco mais de trabalho pelo criador de uma extensão por menos trabalho por parte do usuário / consumidor da extensão. Veja minha postagem no blog para mais discussões.
Tipos de UUIDs
By the way, o código em questão chama a função
uuid_generate_v4()
. Isso gera um tipo conhecido como versão 4 onde quase todos os 128 bits são gerados aleatoriamente. Embora isso seja adequado para uso limitado em um conjunto menor de linhas, se você quiser praticamente eliminar qualquer possibilidade de colisão, use outra "versão" do UUID.Por exemplo, a versão 1 original combina o endereço MAC do computador host com a data e hora atuais e um número arbitrário, a chance de colisões é praticamente nula.
Para mais discussão, consulte minha resposta sobre a questão relacionada.
fonte
CREATE EXTENSION IF NOT EXISTS ...
se você não tem certeza e não quiser verificar (em um script por exemplo)pgcrypto
ExtensãoA partir do Postgres 9.4, o
pgcrypto
módulo inclui agen_random_uuid()
função Essa função gera um tipo de UUID versão 4 baseado em número aleatório .Obtenha módulos contrib, se ainda não estiverem disponíveis.
Use o
pgcrypto
módulo.A
gen_random_uuid()
função agora deve estar disponível;Exemplo de uso.
Citação do documento Postgres no
uuid-ossp
módulo.fonte
Depois de ler a resposta do @ ZuzEL, usei o código acima como o valor padrão do ID da coluna e ele está funcionando bem.
fonte
O próximo PostgreSQL 13 suportará nativamente gen_random_uuid () sem a necessidade de ativar nenhuma extensão:
db <> demo de violino
fonte