PostgreSQL FOREIGN KEY与第二个数据库

时间:2014-10-13 18:08:53

标签: sql postgresql

我在PostgreSQL 9.3上运行以下查询:

CREATE TABLE "app_item" 
  ( 
     "id"          SERIAL NOT NULL PRIMARY KEY, 
     "location_id" UUID NOT NULL 
  ); 

CREATE INDEX app_item_e274a5da 
  ON "app_item" ("location_id"); 

ALTER TABLE "app_item" 
  ADD CONSTRAINT app_item_location_id_5cecc1c0b46e12e2_fk_fias_addrobj_aoguid 
  FOREIGN KEY ("location_id") REFERENCES "fias_addrobj" ("aoguid") deferrable 
  initially deferred;

第三个查询返回:

  

错误:关系“fias_addrobj”不存在

  • app_item - 第一个数据库中的表
  • fias_addrobj - 第二个数据库中的表

如何使用此数据库进行正确的查询?

2 个答案:

答案 0 :(得分:1)

必须引用本地表

但是,如下面的链接所述,您可以使用一个使用跨服务器连接的触发器(由dblink促进)来模拟内置的约束方法?

例如,您可以在INSERT上设置触发器,检查给定的FK是否存在以帮助强制执行参照完整性,或者DELETE是否级联

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=101322

P.S。会不惜一切代价避免这种情况。

答案 1 :(得分:1)

我自己没有机会使用它,但您可能希望查看 Foreign Data Wrappers ,它们基​​本上是dblink的继承者。特别是postgres-fdw

一旦 fdw 的常规设置到位(上面的链接中的步骤1-3),您就可以通过CREATE FOREIGN TABLE创建外国表 ,定义类似于远程数据库中的表,然后将该表用作外键 CONSTRAINT的一部分,并查看它是否有效。

如果这不起作用,另一种选择是让ETL将数据(例如,通过 Python 脚本)从远程服务器转移到本地服务器(例如,每小时或每天,取决于大小),然后您将在外键 CONSTRAINT中使用真正的本地表。它不是实时的,但根据您的需要,可能就足够了。