首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有postgres_fdw模块的Postgresql问题

带有postgres_fdw模块的Postgresql问题
EN

Stack Overflow用户
提问于 2016-04-27 15:18:39
回答 1查看 553关注 0票数 1

我正在尝试使用PostgreSQL大师工具,将来自“本地”DB的外键引用到其他DB中的另一个主键(实际上,它们都位于同一台远程计算机上)。我听说过创建一个外部表的postgres_fdw模块,它的作用类似于远程DB中表的副本,但是当我试图执行查询时,会出现以下错误:

"SQL : Error:所引用的关系"foreign_olo“不是一个表”。

这是我的sql代码:

代码语言:javascript
运行
复制
CREATE TABLE edb.olo_config (  
primary_key       integer NOT NULL PRIMARY KEY,
puntamento        varchar,
mail_contatto_to  varchar,
mail_contatto_cc  varchar,
/* Foreign keys */
CONSTRAINT olo_code
  FOREIGN KEY (olo_code)
  REFERENCES edb.foreign_olo(codice_operatore)
) WITH (
  OIDS = FALSE
);

foreign_olo是我用postgres_fdw创建的外部表。我尝试在foreign_olo表上提交一个INSERT或一个简单的SELECT,结果一切顺利,所以我不明白为什么对于外键情况它不能被识别为一个表。谢谢大家能帮我一把!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-28 07:37:37

执行外键约束有两部分:

  • 子表上的INSERT (或FK字段的UPDATE )必须检查父记录是否存在。
  • 父表上的DELETE (或PK字段的UPDATE )必须检查不存在子记录。

FK约束不能引用外部表,因为不可能执行第二个条件--远程服务器无法自动检查本地表中的记录。

您可以相对容易地使用触发器实现第一次检查:

代码语言:javascript
运行
复制
CREATE FUNCTION edb.olo_config_fk_trg() RETURNS TRIGGER AS
$$
BEGIN
  IF NOT EXISTS (
    SELECT 1 FROM edb.foreign_olo
    WHERE codice_operatore = new.olo_code
    FOR KEY SHARE
  )
  THEN
    RAISE foreign_key_violation
      USING MESSAGE = 'edb.foreign_olo.codice_operatore="' || new.olo_code || '" not found';
  END IF;
  RETURN NULL;
END
$$
LANGUAGE plpgsql;

CREATE TRIGGER olo_config_fk_trg
AFTER INSERT OR UPDATE OF olo_code ON edb.olo_config
FOR EACH ROW EXECUTE PROCEDURE edb.olo_config_fk_trg();

您可以在PK表上创建一个类似的触发器来执行更新/删除检查,但它需要在另一个数据库中又一个指向本地olo_config的外部表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36894051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档