Extension exists but uuid_generate_v4 fails

PostgresqlAmazon Web-ServicesAmazon Ec2

Postgresql Problem Overview


At amazon ec2 RDS Postgresql:

=> SHOW rds.extensions;

rds.extensions                                                                                                                                 
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 btree_gin,btree_gist,chkpass,citext,cube,dblink,dict_int,dict_xsyn,earthdistance,fuzzystrmatch,hstore,intagg,intarray,isn,ltree,pgcrypto,pgrowlocks,pg_trgm,plperl,plpgsql,pltcl,postgis,postgis_tiger_geocoder,postgis_topology,sslinfo,tablefunc,tsearch2,unaccent,uuid-ossp
(1 row)

As you can see, uuid-ossp extension does exist. However, when I'm calling the function for generation uuid_v4, it fails:

CREATE TABLE my_table (
    id uuid DEFAULT uuid_generate_v4() NOT NULL,
    name character varying(32) NOT NULL,
    
);

What's wrong with this?

Postgresql Solutions


Solution 1 - Postgresql

The extension is available but not installed in this database.

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Solution 2 - Postgresql

If the extension is already there but you don't see the uuid_generate_v4() function when you do a describe functions \df command then all you need to do is drop the extension and re-add it so that the functions are also added. Here is the issue replication:

db=# \df
                       List of functions
 Schema | Name | Result data type | Argument data types | Type
--------+------+------------------+---------------------+------
(0 rows)
CREATE EXTENSION "uuid-ossp";
ERROR:  extension "uuid-ossp" already exists
DROP EXTENSION "uuid-ossp";
CREATE EXTENSION "uuid-ossp";
db=# \df
                                  List of functions
 Schema |        Name        | Result data type |    Argument data types    |  Type
--------+--------------------+------------------+---------------------------+--------
 public | uuid_generate_v1   | uuid             |                           | normal
 public | uuid_generate_v1mc | uuid             |                           | normal
 public | uuid_generate_v3   | uuid             | namespace uuid, name text | normal
 public | uuid_generate_v4   | uuid             |                           | normal

db=# select uuid_generate_v4();
           uuid_generate_v4
--------------------------------------
 b19d597c-8f54-41ba-ba73-02299c1adf92
(1 row)

What probably happened is that the extension was originally added to the cluster at some point in the past and then you probably created a new database within that cluster afterward. If that was the case then the new database will only be "aware" of the extension but it will not have the uuid functions added which happens when you add the extension. Therefore you must re-add it.

Solution 3 - Postgresql

Looks like the extension is not installed in the particular database you require it.

You should connect to this particular database with

 \CONNECT my_database

Then install the extension in this database

 CREATE EXTENSION "uuid-ossp";

Solution 4 - Postgresql

Step #1: re-install uuid-ossp extention into the exact schema:

If this is a fresh installation you can skip SET and DROP. Credits to @atomCode (details)

SET search_path TO public;
DROP EXTENSION IF EXISTS "uuid-ossp";

CREATE EXTENSION "uuid-ossp" SCHEMA public;

After this, you should see uuid_generate_v4() function IN THE RIGHT SCHEMA (when execute \df query in psql command-line prompt).

Step #2: use fully-qualified names (with schemaname. qualifier):

For example:

CREATE TABLE public.my_table (
    id uuid DEFAULT public.uuid_generate_v4() NOT NULL,

Solution 5 - Postgresql

If you've changed the search_path, specify the public schema in the function call:

public.uuid_generate_v4()

Solution 6 - Postgresql

This worked for me.

create extension IF NOT EXISTS "uuid-ossp" schema pg_catalog version "1.1"; 

make sure the extension should by on pg_catalog and not in your schema...

Solution 7 - Postgresql

Just add this code to the Beginning of your script

DROP EXTENSION IF EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Solution 8 - Postgresql

if you do it from unix command (apart from PGAdmin) dont forget to pass the DB as a parameter. otherwise this extension will not be enabled when executing requests on this DB

psql -d -c "create EXTENSION pgcrypto;"

Solution 9 - Postgresql

Maybe It was the same I was facing. The uuid_generate_v4 was from the public schema and I was trying to run it in a specific schema, so to fix it I did:

SET search_path TO specific_schema;

INSERTO INTO my_table VALUES public.uuid_generate_v4();

You can check the schema where your function is running:

\df uuid_generate_v4

Or

SELECT n.nspname, p.probin, p.proname
FROM
    pg_proc p
    LEFT JOIN pg_namespace n ON p.pronamespace = n.oid
WHERE p.proname like 'uuid_generate_v4';

You can check info related to the extension of the uuid-ossp like this:

SELECT * FROM pg_extension WHERE extname LIKE 'uuid-ossp';

You can add this extension case you don't have it already:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionIncertezaView Question on Stackoverflow
Solution 1 - PostgresqlCraig RingerView Answer on Stackoverflow
Solution 2 - PostgresqlatomCodeView Answer on Stackoverflow
Solution 3 - PostgresqlOlalekan SogunleView Answer on Stackoverflow
Solution 4 - PostgresqlepoxView Answer on Stackoverflow
Solution 5 - PostgresqlBeau BarkerView Answer on Stackoverflow
Solution 6 - PostgresqlMiguel BecerraView Answer on Stackoverflow
Solution 7 - PostgresqlShoniisraView Answer on Stackoverflow
Solution 8 - Postgresqlodin38View Answer on Stackoverflow
Solution 9 - PostgresqlGuilherme AlencarView Answer on Stackoverflow