扩展存在,但uuid_generate_v4失败


99

在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扩展确实存在。但是,当我调用函数generation时uuid_v4,它失败了:

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

);

这怎么了


5
将来,请始终显示任何错误消息的确切文本
克雷格·林格2014年

Answers:


210

该扩展名可用,但未安装在此数据库中。

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

17
该命令应为CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
boatcoder

7
只是要清楚,选择一个数据库可以\c <db name>在pgsql控制台中编写
ElementalStorm

@CraigRinger在哪里可以找到此文档?
Abhishek Mani

25

如果扩展名已经存在,但是在执行describe functions \ df命令时看不到uuid_generate_v4()函数,那么您要做的就是删除扩展名并重新添加,以便也添加这些功能。这是问题复制:

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函数。因此,您必须重新添加它。


17

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

您应该使用以下命令连接到该特定数据库

 \CONNECT my_database

然后在该数据库中安装扩展

 CREATE EXTENSION "uuid-ossp";


2

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

public.uuid_generate_v4()

0

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

psql -d -c“创建扩展pgcrypto”;


0

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

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

CREATE EXTENSION "uuid-ossp" SCHEMA public;

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

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

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

CREATE TABLE public.my_table (
    id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.