使用外部数据包装器删除PostgreSQL中的外部模式

时间:2016-11-21 20:29:23

标签: mysql database postgresql

在PostgreSQL中使用MySQL外部数据包装器有一个很好的技巧,可以让你快速告诉Postgres关于MySQL数据库中的所有表。它如下:

IMPORT FOREIGN SCHEMA my_favourite_database FROM SERVER mysql_server INTO public;

没有模拟DROP FOREIGN SCHEMA。虽然DROP FOREIGN TABLE可以对每个表进行零碎处理,但这也需要知道外部数据库中所有表的名称。我也不确定这个命令实际上DROP是外国数据库中的表还是只是与它的连接。

如何自动接近这一点。

我认为相同的方法适用于PostgreSQL中的任何外部数据包装器

2 个答案:

答案 0 :(得分:4)

drop foreign table只删除“本地”外部表定义,而不是远程服务器中的表。

您可以使用短PL / pgSQL块删除所有外表:

do
$$
declare
  l_rec record;
begin
  for l_rec in (select foreign_table_schema, foreign_table_name 
                from information_schema.foreign_tables) loop
     execute format('drop foreign table %I.%I', l_rec.foreign_table_schema, l_rec.foreign_table_name);
  end loop;
end;
$$

这将删除当前数据库中的所有外部表。如果您只想将其限制为某些表,则可以相应地调整for循环中的查询,例如通过仅选择特定外部服务器where foreign_server_name = 'mysql'

的那些服务器

我还会将所有这些外来表放在一个单独的模式中,将它们与“常规”表格分开 - 但这是个人品味的问题。

答案 1 :(得分:1)

您可以删除整个架构并再次导入,而不是遍历所有表:

DROP SCHEMA IF EXISTS ramu cascade;
CREATE SCHEMA ramu;
IMPORT FOREIGN SCHEMA ramu FROM SERVER ramsingh INTO ramu;