我尝试使用PostgreSQL Maestro工具引用来自" local"的外键。 DB到另一个DB内的其他主键(实际上,它们都在同一台远程计算机上)。 我已经听说过postgres_fdw模块来创建一个外表,它就像远程数据库中的表的副本,但是当我尝试执行我的查询时,我有这个错误:
" 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 :(得分:0)
强制执行外键约束有两个部分:
INSERT
(或UPDATE
FK字段)必须检查父记录是否存在。DELETE
(或UPDATE
PK字段)必须检查是否存在子记录。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
的外表。