PostgreSQL删除用户失败,删除已存在的schema却报错不存在
解决PostgreSQL删除用户失败+Schema存在却删不掉的问题
嘿,我来帮你搞定这个PostgreSQL里的小麻烦!你遇到的情况其实是个挺常见的坑——咱们一步步来拆解:
问题根源
你删user1时被告知它是schema1的所有者,可你去删schema1又说不存在,但\dn明明能看到它。这十有八九是Schema名称的大小写问题在搞鬼!
PostgreSQL对对象名称(比如Schema、表)的规则是:如果创建时没加双引号,系统会自动把名称转成小写存起来;但如果创建时用了双引号(比如CREATE SCHEMA "Schema1";),那名称就会严格保留大小写,后续操作必须用双引号包裹才能识别到它。
解决步骤
先查清楚Schema的真实名称
执行这条SQL,看看系统表里存的Schema到底叫啥:SELECT nspname FROM pg_namespace WHERE nspname LIKE '%schema1%';要是结果里的名称带大小写(比如
"Schema1"),那就是大小写的问题没错了。用正确的名称删除Schema
查到真实名称后,用双引号包裹着执行删除命令:DROP SCHEMA "schema1" CASCADE;(注意引号里的名称要和你查到的完全一致,比如是
Schema1就写"Schema1")最后删除用户
等Schema删干净了,再删用户就没问题了:DROP USER user1;
为啥会这样?
你可能好奇为啥\dn能看到但SQL命令找不到——因为\dn是psql的专属元命令,它会直接读系统表显示原始名称;但你直接写DROP SCHEMA schema1;时,PostgreSQL会自动把schema1转成小写去匹配,要是实际存的是大写或混合大小写,自然就匹配不上啦!
以后创建对象的时候,要是不需要区分大小写,尽量别用双引号裹着名称,就能避开这类坑啦~
内容的提问来源于stack exchange,提问作者cogitoergosum




