2

テーブルAへの外部キーを持つテーブルBがあり、Aで「DELETECASCADE」を実行したいのですが、PostgreSQLは以下を受け入れません。

DELETE FROM ATable WHERE aid IN
(
    DELETE FROM BTable WHERE aid IN
    (
        ... [expression that depends on the entries in BTAble] ...
    )
    RETURNING aid
);

SELECTのみがIN ()句の中に入ることができるようです。これを行う簡単な(そしてPostgreSQL固有ではない標準SQL?)方法があると思いますか?

編集:あなたがこの種の問題にぶつかったとき、何かがひどく構造化されていると言っても安全ですか?私たちの場合、ヒットは..[expr]..ATableのサブセットとしてではなく、新しいCTAbleにあるべきだと直感していますが、それをサポートする設計パラダイムを実際に示すことはできません。

4

4 に答える 4

2

これはPostgreSQL9.1で可能になりますが、カスケード制約を定義せずにそれを行う方法はないと思います。

http://developer.postgresql.org/pgdocs/postgres/queries-with.html#QUERIES-WITH-MODIFYING

于 2011-04-15T12:20:10.347 に答える
2

9.1その間、集合を返す関数を待つか、作成することができます。

CREATE OR REPLACE FUNCTION fn_delete_btable(params)
RETURNS SETOF btable.aid%TYPE
AS
$$
        DELETE
        FROM    btable
        WHERE   expression_over_params(params)
        RETURNING 
                aid
$$
LANGUAGE 'sql';

DELETE
FROM    atable
WHERE   aid IN
        (
        SELECT  aid
        FROM    fn_delete_btable(params)
        )

PSあなたがそれをする標準的なSQL方法について知らない場合に備えて。

このようなテーブルを作成する場合:

CREATE TABLE btable (aid INT NOT NULL UNIQUE, …)
CREATE TABLE atable (aid INT NOT NULL FOREIGN KEY REFERENCES (aid) ON DELETE CASCADE, …)

次に、fromを削除すると、fromもbtable削除さatableれます。

これが機能するためには、またはであるbtable.aid必要があります。これは、セットベースのソリューションよりも大量更新の効率が低くなります。UNIQUEPRIMARY KEY

于 2011-04-15T12:30:36.643 に答える
1

あなたはそれをすることができるはずです:これは私がこのページの一番下で見つけた例です。

CREATE TABLE order_items (
    product_no integer REFERENCES products ON DELETE RESTRICT,
    order_id integer REFERENCES orders ON DELETE CASCADE,
    quantity integer,
    PRIMARY KEY (product_no, order_id)
);
于 2011-04-15T12:29:54.697 に答える
-1

DB関数は私の快適ゾーンの外にあり(私は知っています、私は知っています)、問題の列に一時的な変更を加えたくなかったので、単に

CREATE TABLE CTable AS ... [expression that depends on BTAble] ...;

これを使用して、BとAのデータを順番に削除しました。

于 2011-04-15T12:48:28.157 に答える