“CREATE EXTENTION IF NOT EXISTS”并没有真正检查扩展是否不存在

bir*_*n04 0 sql postgresql

我想加载cube扩展,但它可能已经加载了。所以我这样做

CREATE EXTENSION IF NOT EXISTS cube;
Run Code Online (Sandbox Code Playgroud)

文档说,当指定 IF NOT EXISTS 时,它不应该抛出错误。但它确实:

ff_postgres_1  | 2020-07-26 18:15:46.233 UTC [33] ERROR:  duplicate key value violates unique constraint "pg_extension_name_index"
ff_postgres_1  | 2020-07-26 18:15:46.233 UTC [33] DETAIL:  Key (extname)=(cube) already exists.
ff_postgres_1  | 2020-07-26 18:15:46.233 UTC [33] STATEMENT:  
ff_postgres_1  |                    CREATE EXTENSION IF NOT EXISTS cube;
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?我正在运行 PostgreSQL 12.3

jja*_*nes 5

你可以通过比赛得到这个。如果两个会话尝试同时创建扩展,则两个会话都无法IF NOT EXISTS看到另一个会话,因此两者都会通过该步骤。第一个将其行插入到 pg_extension 中的块获胜,其他块获胜。然后,一旦第一个会话提交,第二个会话就会解锁并失败并显示此消息。