2016-04-27 100 views
1

我想用PostgreSQL Maestro工具来引用一个来自“本地”数据库的外键到另一个数据库内的其他主键(实际上,它们都是相同的远程机器)。 我听说过关于postgres_fdw模块来创建一个外表,其行为像远程数据库内表的副本,但是当我尝试执行我的查询时,出现此错误:postgres_fdw模块Postgresql问题

“SQL错误:错误:引用关系“foreign_olo”不是表格“。

这是我的SQL代码:

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,并且一切顺利,所以我无法理解为什么外键的情况下它不能被识别为表。 谢谢大家会帮我一把!

回答

0

有两个部分,以强制执行外键约束:在子表

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

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

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

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

+0

非常感谢! – JinLemon