私は、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
句に使用したいと思うと思います。
アイデアや説明はありますか?私は間違って何をしていますか?
すぐにルールに入ることなく(ヘビのネストです)、ビューを 'SELECT 2 * id、... FROM table1 UNION SELECT 2 * id + 1、.. FROM table2'?それは厄介な副選択をやめてしまいます。条件なしでルールを試してみて、それが機能するかどうか確認してください(行が更新/削除されていない場合は、それは問題ありません)。 –
@LaurenzAlbe他のテーブルを参照するために最初のテーブルのIDを保持したいので、 'VIEW'はこの方法でなければなりません。 'DO ALSO'の前に条件がなければ、両方のテーブルのデータセットを更新します。 UPDATEに条件がなければ、両方のテーブルのすべてのデータセットを更新します。 – StupidNPC
ルールは推奨されません。代わりに 'の代わりに'を使用してください。 –