在 PostgreSQL 中跨数据库插入
INSERT across Databases in PostgreSQL
我正在尝试执行从一个数据库到另一个数据库的 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 是 table 自动递增人员的主键。
PG在跨库插入时不自增id是什么原因?有 'recommended' 解决方法吗?
谢谢。
--编辑--
澄清一下:
我有 2 个数据库、模型和登录,每个数据库都有一个 dbo 模式。登录有一个名为登录的模式,用于外部数据包装器。
目标来自我的数据库:模型,使用我们导入的 tables 的模式登录调用登录数据库 table(例如 INSERT INTO login.hospitals... 等)
出于所有意图和目的,这家医院 table 是这样创建的:
CREATE TABLE People(ID SERIAL NOT NULL, name TEXT, phonenumber TEXT);
我希望这能澄清任何问题。
在搜索时我发现了这些解决方案:
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
这些本质上涉及创建一个外部 table 并维护两个 table,这是我想避免的。
因此,我的解决方案是为从调用数据库(例如模型)调用的每个 table 在源数据库(例如登录)上创建一个触发器。此触发器将在 在 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;
谢谢!
我正在尝试执行从一个数据库到另一个数据库的 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 是 table 自动递增人员的主键。
PG在跨库插入时不自增id是什么原因?有 'recommended' 解决方法吗?
谢谢。
--编辑-- 澄清一下: 我有 2 个数据库、模型和登录,每个数据库都有一个 dbo 模式。登录有一个名为登录的模式,用于外部数据包装器。 目标来自我的数据库:模型,使用我们导入的 tables 的模式登录调用登录数据库 table(例如 INSERT INTO login.hospitals... 等)
出于所有意图和目的,这家医院 table 是这样创建的:
CREATE TABLE People(ID SERIAL NOT NULL, name TEXT, phonenumber TEXT);
我希望这能澄清任何问题。
在搜索时我发现了这些解决方案:
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
这些本质上涉及创建一个外部 table 并维护两个 table,这是我想避免的。
因此,我的解决方案是为从调用数据库(例如模型)调用的每个 table 在源数据库(例如登录)上创建一个触发器。此触发器将在 在 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;
谢谢!