gpt4 book ai didi

database - postgres_fdw 模块的 Postgresql 问题

转载 作者:行者123 更新时间:2023-11-29 13:53:19 24 4
gpt4 key购买 nike

我正在尝试使用 PostgreSQL Maestro 工具将来自“本地”数据库的外键引用到另一个数据库中的另一个主键(实际上,它们都在同一台远程机器上)。我听说过 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,并且一切顺利,所以我不明白为什么对于外键情况它不能被识别为一个表。感谢大家帮我一把!

最佳答案

执行外键约束有两个部分:

  • 子表上的 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

关于database - postgres_fdw 模块的 Postgresql 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36894051/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com