我试图从一个数据库到另一个数据库进行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);
我希望这能澄清任何问题。
答案 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;
谢谢!