PostgreSQL中IMPORT FOREIGN SCHEMA不支持IF NOT EXISTS该如何解决?
PostgreSQL IMPORT FOREIGN SCHEMA 无IF NOT EXISTS参数的规避方案
PostgreSQL 原生的IMPORT FOREIGN SCHEMA语法目前确实未内置IF NOT EXISTS支持,你可以根据你的使用场景选择以下3种方案规避表已存在的报错:
- 方案1:PL/pgSQL 匿名块捕获异常(最简便,适合重启执行脚本场景)
直接用匿名块包裹导入逻辑,捕获表重复创建的异常后忽略即可,代码示例:
该方案无需额外判断逻辑,代码量小,适合表结构不会频繁变更、仅需规避脚本执行报错的场景。DO $$ BEGIN -- 替换为你实际的IMPORT FOREIGN SCHEMA语句 IMPORT FOREIGN SCHEMA 远端schema名 FROM SERVER 外部服务器名 INTO 本地存储外部表的schema名; EXCEPTION WHEN duplicate_table THEN -- 遇到表已存在的错误直接跳过,不抛出异常 NULL; END $$; - 方案2:增量导入不存在的表(适合远端表持续新增的场景)
如果你需要只导入本地还未创建的外部表,不想覆盖已有的表定义,可以先查询过滤出本地不存在的远端表,动态生成导入语句:- 先查询待导入的、本地不存在的表列表:
SELECT string_agg(quote_ident(foreign_table_name), ', ') AS to_import_tables FROM information_schema.foreign_tables WHERE foreign_table_schema = '远端schema名' AND foreign_server_name = '外部服务器名' AND foreign_table_name NOT IN ( SELECT table_name FROM information_schema.tables WHERE table_schema = '本地存储外部表的schema名' );- 如果查询结果不为空,将结果拼接进
LIMIT TO子句执行导入即可。
- 方案3:全量刷新外部表(适合每次需要同步最新远端表结构的场景)
如果你的本地schema仅用来存储对应远端的外部表,允许每次执行时刷新所有表定义,可以先批量删除已有外部表再执行导入:
注意该方案会清空本地该schema下的所有外部表,不要在存储了本地普通表的schema下使用。DO $$ DECLARE rec record; BEGIN -- 批量删除本地schema下所有外部表 FOR rec IN SELECT table_name FROM information_schema.tables WHERE table_schema = '本地存储外部表的schema名' AND table_type = 'FOREIGN TABLE' LOOP EXECUTE format('DROP FOREIGN TABLE IF EXISTS 本地存储外部表的schema名.%I', rec.table_name); END LOOP; -- 执行全量导入 IMPORT FOREIGN SCHEMA 远端schema名 FROM SERVER 外部服务器名 INTO 本地存储外部表的schema名; END $$;
内容的提问来源于stack exchange,提问作者nforced
相关产品推荐
相关产品推荐

