3

我正在尝试从一个数据库插入另一个数据库,例如:

//called in database 'model'
INSERT INTO login.Hospital (name, phonenumber) --EDIT, now Hospital
VALUES ('Foo Bar', '555-555-5555');

我收到此错误:

"null value in column "id" violates not-null constraint"

其中列 id 是表 People 上自动递增的主键。

执行插入跨数据库时,PG 不会自动增加 id 是否有原因?有没有“推荐”的方式来解决这个问题?

谢谢你。

--EDIT-- 澄清一下:我有 2 个数据库,模型和登录,每个都使用 dbo 模式。Login 有一个名为 login 的模式,用于外部数据包装器。目标来自我的数据库:模型,使用我们导入的表的架构登录名调用登录数据库表(例如 INSERT INTO login.hospitals... 等)

出于所有意图和目的,此 Hospital 表的创建方式如下:

CREATE TABLE People(ID SERIAL NOT NULL, name TEXT, phonenumber TEXT);

我希望这可以澄清任何问题。

4

1 回答 1

3

在搜索时,我发现了这些解决方案:

https://www.postgresql.org/message-id/26654.1380145647%40sss.pgh.pa.us http://www.slideshare.net/jkatz05/developing-and-deploying-apps-with-the-postgres-fdw

这些基本上涉及创建一个外部表和维护两个表,这是我想避免的。

因此,我的解决方案是为从调用数据库(例如模型)调用的每个表在源数据库(例如登录)上创建一个触发器。此触发器将在INSERT之前触发并调用触发器函数。触发函数如下所示:

CREATE OR REPLACE FUNCTION dbo.tf_insert_cross_schema()
RETURNS TRIGGER AS
$$
DECLARE
    sequenceName TEXT = 'dbo.' || TG_TABLE_NAME || '_id_seq';

BEGIN
    IF (NEW.id IS NULL) THEN
        NEW.id = (SELECT nextval(sequenceName));
    END IF;

    RETURN NEW;
END;
$$
LANGUAGE PLPGSQL VOLATILE;

谢谢!

于 2016-06-22T12:52:39.350 回答