2016-12-26 12 views
0

postgresトリガを使用してINSERT文を2つのテーブルに分割できますか?あなたがinsert into testtable (col1, col2) values (val1a, val1b), (val2a, val2b)を行うのであれば、それは基本的にpostgres SQL insert文をトリガを使用して2つのテーブルに分割

insert into testtable (col1) values (val1a), (val1b) 
insert into anothertable (col2) values (val2a), (val2b) 

のようなものにトリガを翻訳することができtesttableは、元のSQL INSERTがcol2のように見えるにもかかわらず、col2を持っていないことが可能であるtesttable上に存在する必要がありますか?

これはどのようにトリガーを使用して達成できますか?

+0

私はあなたがfirsttable(COL1)の値(val1a)、(val2a)に挿入 '意味疑います。 secondtable(col2)の値(val1b)、(val2b) '... – Dario

答えて

2

INSERTをリダイレクトするには、トリガーまたはルールのいずれかを使用してVIEWを指定できます。

それとも、データ変更のCTEを持つ単一のSQL文でそれを行うことができます。

WITH input(col1, col2) AS (
    VALUES 
    (text 'val1a', text 'val1b') -- explicit type cast in first row 
    , ('val2a', 'val2b') 
    ) 
, ins1 AS (
    INSERT INTO testtable (col1) 
    SELECT col1 FROM input 
    ) 
INSERT INTO anothertable (col2) 
SELECT col2 FROM input; 

典型的には、一つも「val1a」とあなたの入力行何とかの「val1b」との間の接続を記憶することになります。
RETURNING句を使用して、最初のテーブルからシリアルPKを取得し、2番目のテーブルに保存することができます。

関連:

+0

にリンクしているページのRULEメソッドに興味がありますが、ルールは難しいと言います。私はあなたがそこに読むように提案したページを読んだが、私はいくつかのことについてはわからない。ルールにINSTEAD句にいくつかの異なる文がある場合、それらの文はすべてトランザクション的に実行されますか?だから失敗すれば、彼らはすべて失敗するでしょう? – user779159

+1

@ user779159:はい。同じトランザクション内の* anything *が例外を発生させた場合、* whole *トランザクションはロールバックされます。 RULEは、任意の数のステートメントに対して*常に*アトミックです。 –

関連する問題