2

Doctor(SSN、First_Name、Last_Name)、Clinic(ID、Name、Address)、およびWorksFor(Doctor_SSN、Clinic_ID)の関係で、トリガーを追加します。医師が1つのクリニックから別のクリニックに移動するときに、医師の最初のクリニックを挿入してレポートを提出します。と姓、および新旧の診療所名をdoctor_transfer関係に追加します。

次のSQLコードが正しいかどうかを誰かに説明してもらいたいのですが、それに加えて、トリガーと外部キーはどのように機能しますか。

テーブル

CREATE TABLE Doctor(
    SSN INT PRIMARY KEY,
    First_Name VARCHAR(50),
    Last_Name VARCHAR(50),
);

CREATE TABLE Clinic(
    ID INT PRIMARY KEY,
    Name VARCHAR(50),
    Address VARCHAR(255),
);

CREATE TABLE WorksFor(
    Doctor_SSN INT REFERENCES Doctor(SSN),
    Clinic_ID INT REFERENCES Clinic(ID)
);
  1. 上記のコードでは、DoctorandClinicテーブルの具体的な画像を取得できます。しかし、WorksForリレーションはどのように機能しますか?Djangoフレームワークでの私の小さな経験から、外部キーがどのように機能するかはある程度理解していますが、それ以外は、外部キー関係を作成したときにデータベースで何が起こるかわかりません。MySQLは、WorksForリレーションのDoctorテーブルとClinicテーブルの両方のすべての属性を含むまったく新しいテーブルを作成しますか?

  2. そして、トリガーがあります。概念はかなり理解しやすいです。次のSQLコードが上記のタスクの説明と一致することを確認できるかどうかだけを尋ねます。つまり、古いクリニックのIDが新しいクリニックのIDと異なる場合、医師の名、姓、古いクリニック名、新しいクリニック名を含む新しいテーブルを作成します。繰り返しますが、外部キーがどのように正確に機能するかは完全にはわかりません。current.Nameを呼び出すと、Clinic_IDがクリニックの関係を参照しているため、クリニックの名前がわかりますか?そして、Doctorと同じ取引をしますが、以下のコードは機能しますか、それとも私は何かを逃しましたか?

引き金

CREATE TRIGGER DoctorTransfer(
    AFTER UPDATE ON WorksFor
    REFERENCING
        OLD ROW AS current
        NEW ROW AS new
    FOR EACH ROW
    WHEN(current.Clinic_ID <=> new.Clinic_ID)
    INSERT INTO doctor_transfer VALUES
        VALUES(new.First_Name, new.Last_Name, current.Name as Old Clinic,
                         new.Name as New Clinic);
4

1 に答える 1

1

#1の場合

MySQL は、WorksFor リレーションの Doctor テーブルと Clinic テーブルの両方のすべての属性を含むまったく新しいテーブルを作成しますか?

MySQLのドキュメントには、次のように記載されています[強調鉱山]

InnoDB では、外部キーのチェックが高速になり、テーブル スキャンが不要になるように、外部キーと参照キーにインデックスが必要です。参照テーブルには、外部キー列が同じ順序で最初の列としてリストされているインデックスが必要です。このようなインデックスが存在しない場合は、参照テーブルに自動的に作成されます。外部キー制約を適用するために使用できる別のインデックスを作成すると、このインデックスは後でサイレントに削除される可能性があります。index_name が指定されている場合は、前述のように使用されます。

InnoDB では、外部キーが任意のインデックス列または列のグループを参照できます。ただし、参照されるテーブルには、参照される列が最初の列として同じ順序でリストされているインデックスが必要です。

したがって、FK は参照テーブル内のキーの存在 (子への挿入) または参照テーブル内のリファラーの存在 (親の削除/更新) のみを気にするため、インデックスを使用するだけではありません。

#2 の場合、構文の問題がいくつかあります。

Create Triggerドキュメントのサンプル トリガーを次に示します。REFERENCESキーワードなし。いいえ標準句WHENを直接参照して使用しているだけですNEWWHERE

CREATE TRIGGER testref BEFORE INSERT ON test1
  FOR EACH ROW BEGIN
    INSERT INTO test2 SET a2 = NEW.a1;
    DELETE FROM test3 WHERE a3 = NEW.a1;
    UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
  END;
|
于 2012-05-08T21:55:39.137 に答える