Générer un UUID dans Postgres pour insérer la déclaration?
ma question est assez simple. Je suis conscient du concept D'UUID et je veux en générer un pour faire référence à chaque "article" à partir d'un "magasin" dans ma base de données. Semble raisonnable de droit?
le problème est que la ligne suivante renvoie une erreur:
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.
j'ai lu la page à: http://www.postgresql.org/docs/current/static/uuid-ossp.html
Je lance Postgres 8.4 sur Ubuntu 10.04 x64.
5 réponses
uuid-ossp
est un module contrib, il n'est donc pas chargé dans le serveur par défaut. Vous devez le charger dans votre base de données à utiliser.
pour les versions PostgreSQL modernes (9.1 et plus récentes) c'est facile:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
mais pour 9.0 et en dessous, vous devez exécuter le script SQL pour charger l'extension. Voir la documentation pour les modules contrib en 8.4 .
pour Pg 9.1 et versions ultérieures, lire la contrib docs et CREATE EXTENSION
. Ces fonctionnalités n'existent pas dans les versions 9.0 ou plus anciennes, comme votre 8.4.
si vous utilisez une version empaquetée de PostgreSQL, vous devrez peut-être installer un paquet séparé contenant les modules et les extensions de contrib. Rechercher dans votre base de données package manager pour 'postgres' et 'contrib'.
Sans extensions (cheat)
SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);
output>> c2d29867-3d0b-d497-9191-18a9d8ee7830
(travaux au moins en 8.4)
bon point de @Erwin Brandstetter pour utiliser clock_timestamp()
aussi, dans Postgres modernes, vous pouvez simplement lancer:
SELECT md5(random()::text || clock_timestamp()::text)::uuid
Le répondre par Craig Sonnerie est correct. Voici un peu plus d'information pour Postgres 9.1 and later...
Est Une Extension Disponible?
vous ne pouvez installer une extension que si elle a déjà été construite pour votre installation Postgres (votre cluster en Lingo Postgres). Par exemple, j'ai trouvé le UUID-ossp extension inclus dans le cadre de L'installateur pour Mac OS X aimablement fourni par EnterpriseDB.com. N'importe lequel des quelques douzaines d'extensions peut être disponible.
pour voir si l'extension uuid-ossp est disponible dans votre cluster Postgres, exécutez ce SQL pour interroger le pg_available_extensions
catalogue système:
SELECT * FROM pg_available_extensions;
Installer L'Extension
pour installer cette extension UUID , utilisez la commande CREATE EXTENSION comme vu dans ce SQL:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
attention: j'ai trouvé que les caractères de guillemets autour du nom de l'extension étaient nécessaires, malgré la documentation contraire.
le Comité des normes SQL ou L'équipe de Postgres a choisi un nom bizarre pour cette commande. À mon avis, ils auraient dû choisir quelque chose comme "INSTALL EXTENSION" ou "USE EXTENSION".
Vérifier L'Installation
vous pouvez vérifier que l'extension a été installée avec succès dans la base de données désirée en exécutant ce SQL pour interroger le pg_extension
catalogue système:
SELECT * FROM pg_extension;
UUID comme valeur par défaut
pour plus d'informations, voir la Question: valeur par défaut pour la colonne UUID dans Postgres
À L'Ancienne
le l'information ci-dessus utilise la nouvelle Extensions caractéristique ajouté à Postgres 9.1. Dans les versions précédentes, nous devions trouver et exécuter un script dans un .fichier sql . La fonctionnalité Extensions a été ajoutée pour faciliter l'installation, en échangeant un peu plus de travail pour le créateur d'une extension pour moins de travail de la part de l'utilisateur/consommateur de l'extension. Voir mon blog post pour plus discussion.
Uuid
soit dit en passant, le code dans la Question appelle la fonction uuid_generate_v4()
. Cela génère un type connu sous le nom Version 4 où presque tous les 128 bits sont générés au hasard. Alors que c'est très bien pour une utilisation limitée sur un plus petit ensemble de lignes, si vous voulez pratiquement éliminer toute possibilité de collision, utilisez une autre "version" D'UUID.
par exemple, l'original Version 1 combine le adresse MAC de l'ordinateur hôte avec la date-heure actuelle et un nombre arbitraire, le risque de collisions est pratiquement nul.
pour plus de détails, voir ma réponse sur une question connexe.
pgcrypto
Extension
à partir de Postgres 9.4, le module pgcrypto
inclut la fonction gen_random_uuid()
. Cette fonction génère un des nombres aléatoires basés Version 4 type de UUID .
obtenir modules contrib, si pas déjà disponibles.
sudo apt-get install postgresql-contrib-9.4
utiliser" module 151930920".
CREATE EXTENSION "pgcrypto";
le gen_random_uuid()
fonction devrait maintenant être disponible;
exemple d'usage.
INSERT INTO items VALUES( gen_random_uuid(), 54.321, 31, 'desc 1', 31.94 ) ;
Citation de Postgres doc sur uuid-ossp
module.
Note: Si vous n'avez besoin que d'UUIDs générés au hasard (version 4), envisagez plutôt d'utiliser la fonction gen_random_uuid() du module pgcrypto.
ALTER TABLE table_name ALTER COLUMN id SET DEFAULT uuid_in((md5((random())::text))::cstring);
après avoir lu la réponse de @ZuzEL, j'ai utilisé le code ci-dessus comme valeur par défaut de la colonne id et ça marche très bien.