扩展存在但uuid_generate_v4失败

时间:2014-03-17 03:34:08

标签: postgresql amazon-web-services amazon-ec2

在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)

如您所见,uuid-ossp扩展确实存在。但是,当我调用生成uuid_v4的函数时,它会失败:

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

);

这有什么问题?

8 个答案:

答案 0 :(得分:94)

该数据库中的扩展程序可用,但已安装

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

答案 1 :(得分:9)

如果扩展已经存在,但是当您执行描述功能 \ df 命令时,您没有看到uuid_generate_v4()函数,那么您只需要do是删除扩展并重新添加它以便添加功能。这是问题复制:

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)

可能发生的事情是扩展最初是在过去的某个时刻添加到集群中的,然后您可能在之后的集群中创建了一个新数据库。如果是这种情况,那么新数据库将只有"意识到"扩展但它不会添加uuid功能添加扩展时发生的。因此,您必须重新添加它。

答案 2 :(得分:5)

看起来扩展名未安装在您需要的特定数据库中。

您应该使用

连接到此特定数据库
 \CONNECT my_database

然后在此数据库中安装扩展程序

 CREATE EXTENSION "uuid-ossp";

答案 3 :(得分:2)

这对我有用。

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

确保扩展名应在pg_catalog上而不是在您的架构中...

答案 4 :(得分:2)

如果您更改了search_path,请在函数上指定公共模式:

public.uuid_generate_v4()

答案 5 :(得分:0)

如果你从unix命令(除PGAdmin之外)执行此操作,请不要忘记将DB作为参数传递。否则在此DB上执行请求时将不会启用此扩展

psql -d -c“create EXTENSION pgcrypto;”

答案 6 :(得分:0)

#1以确切的模式重新安装uuid-ossp扩展:

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

CREATE EXTENSION "uuid-ossp" SCHEMA public;

如果这是全新安装,则可以跳过SETDROP。归功于@atomCode(details

此后,您应该在正确的架构中看到 uuid_generate_v4()函数(在 psql 命令行提示符下执行\df查询时)

#2使用标准名称(带有schemaname.限定词):

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

答案 7 :(得分:0)

也许这和我面临的一样。 uuid_generate_v4 来自 public 架构,我试图在特定架构中运行它,因此我做了以下修复:

SET search_path TO specific_schema;

INSERTO INTO my_table VALUES public.uuid_generate_v4();

您可以检查运行函数的架构:

\df uuid_generate_v4

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';

您可以像这样查看与 uuid-ossp 扩展相关的信息:

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

你可以添加这个你还没有的扩展案例:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
相关问题