在PostgreSQL中跨数据库插入

时间:2016-06-21 15:17:27

标签: postgresql insert cross-database

我试图从一个数据库到另一个数据库进行INSERT,例如:

//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是表上的主键自动递增的人员。

在执行插入跨数据库时,PG是否有理由自动增加id?是否有推荐的'这个方法呢?

谢谢。

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

对于所有意图和目的,这个Hospital表是这样创建的:

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

我希望这能澄清任何问题。

1 个答案:

答案 0 :(得分:2)

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

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

这些主要涉及创建一个外表并维护两个表,这是我想要避免的。

所以,我的解决方案是在源DB(例如Login)上为从调用DB调用的每个表(例如Model)创建一个触发器。 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;

谢谢!

相关问题