我正在尝试使用PostgreSQL大师工具,将来自“本地”DB的外键引用到其他DB中的另一个主键(实际上,它们都位于同一台远程计算机上)。我听说过创建一个外部表的postgres_fdw模块,它的作用类似于远程DB中表的副本,但是当我试图执行查询时,会出现以下错误:
"SQL : Error:所引用的关系"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,结果一切顺利,所以我不明白为什么对于外键情况它不能被识别为一个表。谢谢大家能帮我一把!
发布于 2016-04-28 07:37:37
执行外键约束有两部分:
INSERT (或FK字段的UPDATE )必须检查父记录是否存在。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的外部表。
https://stackoverflow.com/questions/36894051
复制相似问题