wall テーブルの wall_id を更新すると、wall_categories テーブルの wall_id も更新されますか? wall_categories テーブルの wall_id は、walls テーブルの wall_id を参照します。
これは、desktop_wall テーブルの desktop_id を参照する外部キーであるため、wall テーブルの desktop_id と同じです。wall テーブルの desktop_id を更新すると、deskotp_wall の desktop_id も更新されますか?
いいえ、更新は自動的には行われません。実際、参照整合性SQLException
を壊そうとしているため、更新が失敗するため、エラーが発生します。これは、テーブルに
有効に適用されていることを前提としています。Constraints
もあり
ON UPDATE CASCADE
ますが、すべてのデータベースでサポートされている
わけではありません。一方、カスケード更新は明らかに優先されるべきです。データベースがサポートしていない場合は、
after-row Trigger
を実装する必要があります。
たとえば、Oracle
これを次のように実装します。
CREATE OR REPLACE TRIGGER walls_wall_upd_trg
AFTER UPDATE OF wall_id ON walls FOR EACH ROW
BEGIN
UPDATE wall_categories
SET wall_id = :new.wall_id
WHERE wall_id = :old.wall_id;
UPDATE wall_comments
SET wall_id = :new.wall_id
WHERE wall_id = :old.wall_id;
END;
CREATE OR REPLACE TRIGGER walls_desk_upd_trg
AFTER UPDATE OF desktop_id ON walls FOR EACH ROW
BEGIN
UPDATE desktop_wall
SET desktop_id = :new.desktop_id
WHERE desktop_id = :old.desktop_id;
END;