sql >> データベース >  >> RDS >> Mysql

複数列の外部キー:すべてではなく、削除時に単一の列をNullに設定します

    いくつかの調査の結果、特定の要件は外部キーを使用して実装できないようです。

    最善の解決策は、外部キーを組み合わせて使用​​することです。 およびトリガー

    この問題は、次のステートメントによって特定の例で解決できます。

    CREATE TABLE lectures (
      lectureId INT NOT NULL,
      title VARCHAR(10) NOT NULL,
      PRIMARY KEY (lectureId)
     );
    
    CREATE TABLE groups (
      lectureId INT NOT NULL,
      groupNo INT NOT NULL,
      title VARCHAR(10) NOT NULL,
      PRIMARY KEY (lectureId,groupNo),
      FOREIGN KEY (lectureId) REFERENCES lectures (lectureId)
        ON UPDATE CASCADE ON DELETE CASCADE
     );
    
    CREATE TABLE studentListed (
      studentId INT NOT NULL,
      lectureId INT NOT NULL,
      groupNo INT NULL,
      PRIMARY KEY (studentId,lectureId),
      FOREIGN KEY (lectureId) REFERENCES lectures (lectureId) 
        ON UPDATE CASCADE ON DELETE CASCADE,
      FOREIGN KEY (lectureId,groupNo) REFERENCES groups (lectureId,groupNo)
        ON UPDATE CASCADE ON DELETE CASCADE
     );
    
    CREATE TRIGGER GroupDelete BEFORE DELETE ON groups
    FOR EACH ROW
      UPDATE studentListed SET studentListed.groupNo = NULL
        WHERE studentListed.lectureId = OLD.lectureId
        AND studentListed.groupNo = OLD.groupNo;
    

    最後の外部キーの「ONDELETECASCADE」は、トリガーが対応する行をnullにすることによって外部キー参照をすでに削除しているため、カスケード削除につながることはないことに注意してください。

    追加:「ONDELETE CASCADE」を使用する代わりに、同じトリガーで「ON DELETE SET NULL」を使用できますが、「lectureId」はnull可能である必要があり、「CHECK(lectureId IS NOTNULL)」を含める必要があります。 nullに設定されないようにするため




    1. Spring 3 /PostgreSQL8.4.9の行挿入から自動生成されたキーを取得する

    2. Visual Foxpro dbfsをMySQLと同期する方法は?

    3. SQL Server 2005にはMySqlのENUMデータ型と同等のものがありますか?

    4. アセットフォルダに配置されているAndroidのデータベースファイルからバージョン番号を読み取る方法