5

シンプルなデータベース設計

上記は私の単純なデータベース設計です。私はデータベースにまったく慣れていないので、物事がどのように起こるかについての情報を得たかっただけです。以下は私の質問です:

  1. wall テーブルの wall_id を更新すると、wall_categories テーブルの wall_id も更新されますか? wall_categories テーブルの wall_id は、walls テーブルの wall_id を参照します。

  2. これは、desktop_wall テーブルの desktop_id を参照する外部キーであるため、wall テーブルの desktop_id と同じです。wall テーブルの desktop_id を更新すると、deskotp_wall の desktop_id も更新されますか?

  3. デフォルトで更新されない場合、どうすれば更新できますか?

どうもありがとう!

4

4 に答える 4

4

この機能は、カスケード参照整合性と呼ばれます。外部キー制約を定義する場合はオプションです。これを有効にする構文は次のとおりです (Microsoft SQL ですが、構文は標準であり、ほとんどの DBMS でサポートされています)。

http://technet.microsoft.com/en-us/library/ms186973(v=sql.105).aspx

于 2013-10-26T17:38:37.620 に答える
3

postgresqlでは、私はこのように書きます

ALTER TABLE a_table
ADD CONSTRAINT fk_a_b FOREIGN KEY (a_id)
REFERENCES b_table (b_some_id) 
ON DELETE CASCADE ON UPDATE CASCADE;

カスケードされた方法でファイルが更新および削除されることを取得します。

于 2013-10-26T17:34:34.723 に答える
2

いいえ、外部キーは自動的に更新されません。自分で参照されているテーブルの外部キーを更新する必要があります。そうしないと、参照整合性例外が発生します。

外部キーを自動的に更新するには、TRIGGERSを使用できます。

編集:-

コメントでsqlvogelが示唆しているように、DBMSがカスケード更新をサポートしている場合、そのためにTRIGGERSを作成する必要はありません。

その場合、 Cascading Reference Integrity Constraintsがあればより良いでしょう。

カスケード参照整合性制約を使用すると、既存の外部キーが指すキーをユーザーが削除または更新しようとしたときに SQL Server が実行するアクションを定義できます。

于 2013-10-26T17:28:15.970 に答える
2
  1. wall テーブルの wall_id を更新すると、wall_categories テーブルの wall_id も更新されますか? wall_categories テーブルの wall_id は、walls テーブルの wall_id を参照します。

  2. これは、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;
于 2013-10-26T17:29:51.673 に答える