Ma question est assez simple. Je connais le concept d'un UUID et je veux en générer un pour faire référence à chaque 'article' d'un 'magasin' dans ma base de données avec. Semble raisonnable non?
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 sur: http://www.postgresql.org/docs/current/static/uuid-ossp.html
J'utilise Postgres 8.4 sur Ubuntu 10.04 x64.
postgresql
uuid
postgresql-8.4
anon58192932
la source
la source
select dbo.uuid_generate_v4()
Réponses:
uuid-ossp
est un module contrib, il n'est donc pas chargé sur le serveur par défaut. Vous devez le charger dans votre base de données pour l'utiliser.Pour les versions PostgreSQL modernes (9.1 et plus récentes), c'est simple:
mais pour la version 9.0 et inférieure, vous devez plutôt exécuter le script SQL pour charger l'extension. Voir la documentation des modules contrib au 8.4 .
Pour Pg 9.1 et plus récent, lisez plutôt les documents de contribution actuels et
CREATE EXTENSION
. Ces fonctionnalités n'existent pas dans les versions 9.0 ou antérieures, comme votre 8.4.Si vous utilisez une version packagée de PostgreSQL, vous devrez peut-être installer un package séparé contenant les modules contrib et les extensions. Recherchez dans la base de données de votre gestionnaire de paquets «postgres» et «contrib».
la source
apt-get install postgresql-contrib
ou similaire. Essayezapt-cache search postgresql |grep contrib
de trouver le nom de package souhaité.postgresql-contrib
package, vous obtiendrez l'erreur: ERREUR: impossible d'ouvrir le fichier de contrôle d'extension "/usr/share/postgresql/9.3/extension/uuid-ossp.control": aucun fichier ou répertoire de ce typeSans extensions (triche)
(fonctionne au moins en 8.4)
clock_timestamp()
explications.Si vous avez besoin d'un UUID v4 valide
* Merci à @Denis Stafichuk @Karsten et @autronix
De plus, dans Postgres moderne, vous pouvez simplement lancer:
SELECT md5(random()::text || clock_timestamp()::text)::uuid
la source
uuid_in(md5(random()::text || now()::text)::cstring);
uuid-ossp
, mais je travaille par exemple sur une instance PostgreSQL où je n'ai pas les privilèges suffisants pour installer une extension.clock_timestamp()
est la meilleure alternative dans les deux cas pour cela. Contrairement ànow()
ouCURRENT_TIMESTAMP
il est volatil et renvoie l'heure actuelle réelle.SELECT uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);
De plus, dans les Postgres modernes, vous pouvez simplement lancer:SELECT md5(random()::text || clock_timestamp()::text)::uuid
- pas besoin de plus de magie. Cas d'utilisation: stackoverflow.com/a/8335376/939860select overlay(overlay(md5(random()::text || ':' || clock_timestamp()::text) placing '4' from 13) placing '8' from 17)::uuid;
La réponse de Craig Ringer est correcte. Voici un peu plus d'informations sur Postgres 9.1 et versions ultérieures…
L'extension est-elle disponible?
Vous ne pouvez installer une extension que si elle a déjà été construite pour votre installation Postgres (votre cluster dans le jargon Postgres). Par exemple, j'ai trouvé l' extension uuid-ossp incluse dans le cadre du programme d'installation pour Mac OS X gracieusement fourni par EnterpriseDB.com. L'une des quelques dizaines 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:Installer l'extension
Pour installer cette extension UUID , utilisez la commande CREATE EXTENSION comme indiqué dans ce SQL:
Attention: j'ai trouvé que les caractères MARQUE DE CITATION autour du nom de l'extension étaient requis, malgré la documentation contraire.
Le comité des normes SQL ou l'équipe Postgres a choisi un nom étrange pour cette commande. À mon avis, ils auraient dû choisir quelque chose comme "INSTALLER UNE EXTENSION" ou "UTILISER UNE EXTENSION".
Vérifier l'installation
Vous pouvez vérifier que l'extension a été correctement installée dans la base de données souhaitée en exécutant ce SQL pour interroger le
pg_extension
catalogue système:UUID comme valeur par défaut
Pour plus d'informations, voir la colonne Question: Valeur par défaut de l'UUID dans Postgres
The Old Way
Les informations ci-dessus utilisent la nouvelle fonctionnalité Extensions ajoutée à 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, échangeant un peu plus de travail pour le créateur d'une extension contre moins de travail de la part de l'utilisateur / consommateur de l'extension. Voir mon article de blog pour plus de discussion.
Types d'UUID
Soit dit en passant, le code de la question appelle la fonction
uuid_generate_v4()
. Cela génère un type connu sous le nom de version 4 où presque tous les 128 bits sont générés de manière aléatoire. Bien que cela soit bien pour une utilisation limitée sur un plus petit ensemble de lignes, si vous voulez éliminer pratiquement toute possibilité de collision, utilisez une autre "version" d'UUID.Par exemple, la version originale 1 combine l' 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 discussion, voir ma réponse à une question connexe.
la source
CREATE EXTENSION IF NOT EXISTS ...
si vous n'êtes pas sûr et que vous ne voulez pas vérifier (dans un script par exemple)pgcrypto
ExtensionDepuis Postgres 9.4, le
pgcrypto
module comprend lesgen_random_uuid()
fonction. Cette fonction génère l'un des UUID de type version 4 basés sur des nombres aléatoires .Obtenez les modules contrib, s'ils ne sont pas déjà disponibles.
Utilisez le
pgcrypto
module.La
gen_random_uuid()
fonction devrait maintenant être disponible;Exemple d'utilisation.
Citation du document Postgres sur le
uuid-ossp
module.la source
Après avoir lu la réponse de @ ZuzEL, j'ai utilisé le code ci-dessus comme valeur par défaut de l'id de la colonne et cela fonctionne bien.
la source
PostgreSQL 13 à venir prendra en charge nativement gen_random_uuid () sans avoir besoin d'activer les extensions:
démo db <> violon
la source