Postgres中\d显示表foo存在,但\d foo及DROP TABLE提示不存在
Postgres表显示存在但无法访问/删除的可能原因
执行
\d命令返回的表列表显示public模式下存在foo表:Schema | Name | Type | Owner --------+------+-------+---------- public | foo | table | postgres但执行
\d foo提示Did not find any relation named "foo",执行DROP TABLE foo提示ERROR: table "foo" does not exist,即使加上模式名public.foo也无变化。该问题出现在使用ogr2ogr工具(带或不带-overwrite -lco OVERWRITE=YES参数)之后。
以下是可能的原因及排查方案:
- 表名存在大小写或特殊字符问题:ogr2ogr可能创建了带引号的标识符(比如大小写混合的表名,但
\d显示时被Postgres转成小写)。实际表名可能是"Foo"或包含特殊字符,尝试用双引号包裹名称操作:\d "foo"、DROP TABLE "Foo";。也可通过系统表确认真实表名:SELECT relname FROM pg_class WHERE relname LIKE '%foo%' AND relkind = 'r'; - 系统缓存不一致:
\d显示的是缓存的表信息,实际表已被删除但缓存未更新。可刷新缓存或重连数据库:SELECT pg_stat_clear_snapshot(); - 非普通表类型:虽然
\d显示Type为table,但可能是分区表、外部表等特殊关系。通过系统表确认类型:
其中SELECT relkind, relname FROM pg_class WHERE relname = 'foo';relkind为r是普通表,p是分区表,f是外部表。外部表需用DROP FOREIGN TABLE删除,分区表需先删分区再处理父表。 - 事务快照异常:ogr2ogr的操作可能在未提交的事务中,表仅存在于该事务快照内。尝试提交或回滚事务后再操作:
COMMIT; -- 或 ROLLBACK;
内容的提问来源于stack exchange,提问作者Lee Goddard
相关产品推荐
相关产品推荐

