2017-05-16 7 views
1

私は、2つの同様のテーブルで構成されるPostgreSQLのVIEWを持っています。複数のテーブルを表示するPostgreSQLの更新

基本的には両方のテーブルは次のようになります。VIEWで今

id | data 
---+------ 
1 | foo 
2 | bar 
[...] 

、私は、このコマンドでそれらを持っている:

CREATE RULE "_RETURN" AS ON SELECT TO myView DO INSTEAD 
SELECT id, data 
    FROM table1 
    UNION ALL 
SELECT (id + (SELECT MAX(id) FROM table1)), 
    data 
    FROM table2; 

結果は、データ統合の手段のために、両方のテーブルの組み合わせです

id | data 
---+------ 
1 | foo 
2 | bar 
3 | foo 
4 | bar 
[...] 

ここで、そのVに対してUPDATE(およびその後のDELETE)を実行したいとします。 IEW。意図は、データセットが属するテーブルに操作を転送することです。現時点で

が、私はこの何かのリンクを持っている:

CREATE RULE "_UPDATE0" 
    AS ON UPDATE TO users 
    DO INSTEAD NOTHING; 

PostgreSQLは無条件ルールを必要とし、これは "_UPDATE0" である表1にmyView.id <= 2にintentedと転送更新など

CREATE RULE "_UPDATE1" 
    AS ON UPDATE TO users 
    WHERE NEW.id <= (SELECT MAX(table1.id) from table1) 
    DO ALSO 
    (
    UPDATE table1 SET 
     data = NEW.data, 
    WHERE table1.id = NEW.id 
); 

CREATE RULE "_UPDATE2" 
    AS ON UPDATE TO myView 
    WHERE NEW.id > (SELECT MAX(table1.id) from table1) 
    DO ALSO 
    (
    UPDATE table2 SET 
     data = NEW.data, 
    WHERE table2.id IN 
     (SELECT NEW.id - MAX(table1.id) from table1) 
); 

_UPDATE1作品

_UPDATE2はまったく動作していないようです。

編集:それ以上のフィディル化の後、私は_UPDATE2にそれを指摘して、IDのオフセットを差し引いて、私のWHERE句に使用したいと思うと思います。

アイデアや説明はありますか?私は間違って何をしていますか?

+0

すぐにルールに入ることなく(ヘビのネストです)、ビューを 'SELECT 2 * id、... FROM table1 UNION SELECT 2 * id + 1、.. FROM table2'?それは厄介な副選択をやめてしまいます。条件なしでルールを試してみて、それが機能するかどうか確認してください(行が更新/削除されていない場合は、それは問題ありません)。 –

+0

@LaurenzAlbe他のテーブルを参照するために最初のテーブルのIDを保持したいので、 'VIEW'はこの方法でなければなりません。 'DO ALSO'の前に条件がなければ、両方のテーブルのデータセットを更新します。 UPDATEに条件がなければ、両方のテーブルのすべてのデータセットを更新します。 – StupidNPC

+0

ルールは推奨されません。代わりに 'の代わりに'を使用してください。 –

答えて

0

OK、私の_UPDATE2のための解決策を見つけました。

NEW.idを副選択からドラッグしました。

CREATE RULE "_UPDATE2" 
    AS ON UPDATE TO myView 
    WHERE NEW.id > (SELECT MAX(table1.id) from table1) 
    DO ALSO 
    (
    UPDATE table2 SET 
     data = NEW.data, 
    WHERE table2.id = NEW.id - (SELECT MAX(table1.id) from table1) 
); 

しかし、私はこれがなぜ機能するのか分かりません。詳細な説明は高く評価されます。

関連する問題