我似乎在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
我尝试过的事情:
vacuum
任何人对我应该尝试的事情有任何其他想法吗?
答案 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;
$$
;
请注意,此代码假定只存在具有该名称的单个表。