あなたの質問は解釈の余地を残します。私の理解では、RETURNING
が必要です。 INSERT
の句 シーケンスによって生成された主キーの値を返すコマンド。
これを達成する他の方法があります。 nextval()
を使用する場合と同様です。
次のid
を取得します 事前にシーケンスから、id
の行を挿入します スペルアウト。
またはcurrval()
/ lastval()
シーケンス/現在のセッションの任意のシーケンスに対して最後に取得された値を取得します。この関連する回答の詳細:
シーケンスのPostgreSQLの次の値?
RULE ... INSTEAD ..
を使用することもできます この目的のために。
しかし、あなたの質問に答えるために-それが実際にあなたの質問である場合:それは2つのトリガーを使用して行うことができます 。 1つのBEFORE
、1つのAFTER INSERT
。どちらも定義ごとに1つのトランザクションで実行されるため、最初のテーブルのファントム行は誰にも表示されません。 (トリガーを除く)。
デモ:
CREATE TABLE x (
id serial PRIMARY KEY -- note the serial col.
,name text
);
CREATE TABLE y (
id integer PRIMARY KEY
,name text
);
CREATE OR REPLACE FUNCTION trg_x_insbef()
RETURNS trigger AS
$func$
BEGIN
INSERT INTO y SELECT (NEW).*; -- write to other table
RETURN NEW;
END
$func$ LANGUAGE plpgsql;
CREATE TRIGGER insbef
BEFORE INSERT ON x
FOR EACH ROW EXECUTE PROCEDURE trg_x_insbef();
CREATE OR REPLACE FUNCTION trg_x_insaft()
RETURNS trigger AS
$func$
BEGIN
DELETE FROM x WHERE id = NEW.id; -- delete row again.
RETURN NULL;
END
$func$ LANGUAGE plpgsql;
CREATE TRIGGER insaft
AFTER INSERT ON x
FOR EACH ROW EXECUTE PROCEDURE trg_x_insaft();
psqlを呼び出す:
db=# INSERT INTO x (name) values('phantom') RETURNING id;
id
----
1
(1 row)
INSERT 0 1
db=# SELECT * FROM x;
id | name
----+------
(0 rows)
db=# SELECT * FROM y;
id | name
----+---------
1 | phantom
(1 row)