Phantom Postgres表存在但无法删除?

时间:2018-03-26 14:33:10

标签: postgresql

我似乎在Postgres中有某种幽灵表。

假设我执行以下操作:

select * from information_schema.tables where table_schema = 'public';

我明白了:

table_name     | table_type | ...
phantom_table    BASE TABLE
...

所以,我跑:

drop table phantom_table cascade;

我得到了:

ERROR: table "phantom_table" does not exist

我尝试过的事情:

  1. 检查拼写错误并确保架构正确(我甚至从信息架构查询结果中复制/粘贴了表名)。
  2. vacuum
  3. 重新连接。
  4. 从我的用户中杀死其他正在运行的进程(没有其他人正在使用该数据库)。
  5. 检查桌面上的活动锁(没有)。
  6. 任何人对我应该尝试的事情有任何其他想法吗?

1 个答案:

答案 0 :(得分:2)

您可能在名称的末尾有一些空格。

最简单的方法是让format()函数为您生成正确的表名和语句:

select format('drop table %I.%I;', table_schema, table_name) as drop_statement
from information_schema.tables 
where table_schema = 'public'
  and table_name like '%phantom%';

编辑:似乎Windows上的psql无法使用drop语句中的新行处理标识符(但在创建表格时却会这样做) )。

要解决此问题,您可以使用DO块:

do
$$
declare
 l_stmt text;
begin
  select format('drop table %I.%I;', table_schema, table_name) as drop_statement
    into l_stmt
  from information_schema.tables 
  where table_schema = 'public'
    and table_name like '%phantom%';
  execute l_stmt;    
end;
$$
;

请注意,此代码假定只存在具有该名称的单个表。