web-dev-qa-db-ja.com

FK ON UPDATE CASCADEは機能しますか?

直感的に、オプションON UPDATE CASCADEを外部キー制約に追加すると、すべての参照列が更新されたキーの値で更新されます。それは本当にうまくいくでしょうか?

手動から引き上げ

CREATE TABLE products (
    product_no integer PRIMARY KEY,
    name text,
    price numeric
);

CREATE TABLE orders (
    order_id integer PRIMARY KEY,
    shipping_address text,
    ...
);

CREATE TABLE order_items (
    product_no integer REFERENCES products ON DELETE RESTRICT,
    ## HERE'S THE LINE THAT I MODIFIED FROM THE MANUAL, IT USED TO SAY 'ON DELETE CASCADE'
    order_id integer REFERENCES orders ON UPDATE CASCADE,
    quantity integer,
    PRIMARY KEY (product_no, order_id)
);

Postgres 9.1を使用しています。

6
ted.strauss

ON DELETE句とON UPDATE句の可能なオプションについては、マニュアルの CREATE TABLE ページで説明しています。

デフォルトはNO ACTIONであるため、参照されるプライマリキーまたは一意のキーの更新に対して実行するアクションを明示的に指定せずに定義された外部キーがある場合、ON UPDATE NO ACTIONが指定された場合と同じです。

NO ACTION

削除または更新によって外部キー制約違反が発生することを示すエラーを生成します。制約が据え置かれている場合、参照する行がまだ存在する場合、制約チェック時にこのエラーが生成されます。これがデフォルトのアクションです。


外部キーにON UPDATE CASCADEを指定した場合、参照される行が更新されると、参照する行もそれに応じて更新されます。

CASCADE

削除された行を参照している行を削除するか、参照している列の値を、参照されている列の新しい値にそれぞれ更新します。

主キーは通常(そして十分な理由で)更新されませんが、それが役立つ場合があります。さらに、外部キーは、主キーではなく(まれに更新される)一意のキーを参照している可能性があります。

7
ypercubeᵀᴹ