2016-06-21 59 views
2

我試圖從一個數據庫做一個INSERT到另一個,如:INSERT跨數據庫PostgreSQL中

//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插入交叉數據庫?有沒有「推薦」的方法呢?

謝謝。

- 編輯 - 對於澄清: 我有2個數據庫,模型和DBO的架構登錄的每個。登錄有一個稱爲登錄的架構,用於外部數據包裝器。 目標來自我的數據庫:模型,使用模式登錄爲我們導入的表調用登錄數據庫表(例如INSERT INTO login.hospitals ...等)

對於所有意圖和目的,該醫院表是像這樣創建的:

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

我希望這可以澄清任何問題。

+0

在postgres「登錄」willbe架構,而不是數據庫。它與Mysql不同...嘗試在'psql'中運行'\ dt + login.people',它會引起你表 –

+0

的結構你是對的,它將是模式,但我知道表的結構,我需要到INSERT交叉模式。 – Anduril28

+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

這些基本上涉及創建一個外部表和維護兩個表,這是我想避免的。

所以,我的解決方案是在源數據庫(例如,模型)中調用每個表的源數據庫(例如登錄)上創建一個觸發器。這個觸發器將在之前觸發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; 

謝謝!