3

あるデータベースから別のデータベースに 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 は、自動インクリメントするテーブル People の主キーです。

クロスデータベースの挿入を行うときに PG が ID を自動インクリメントしない理由はありますか? これを回避する「推奨」方法はありますか?

ありがとうございました。

--EDIT-- 明確化のために: 私は 2 つのデータベース、モデルとログインをそれぞれ dbo のスキーマで持っています。Login には、Foreign Data Wrapper 用の 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

これらには基本的に、外部テーブルの作成と 2 つのテーブルの維持が含まれますが、これは避けたかったことです。

したがって、私の解決策は、呼び出し元の DB (モデルなど) から呼び出されるテーブルごとに、ソース DB (ログインなど) にトリガーを作成することでした。このトリガーは、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 に答える