2017-03-06 5 views
0

教師または校長のいずれかになることができるユーザーテーブルMy ER diagram があります。私はそれがERのそれのために適切であることを切り離す専門化と思う。私はMySQLのdbmsを使用しているし、テーブルを作成した後、Userテーブル(例えばUserId = 31)にユーザを作成しました。しかし問題は、私がUserId = 31の教師用テーブルに新しいレコードを挿入しているときに、同じUserIdをヘッドマスターテーブルに挿入してもエラーが発生しないときです。私は、これが独立した財産の違反とみなされると思う。ER図のマッピングの特殊化、子テーブルへの挿入での重複

これは

ユーザー(ユーザーID、ユーザー名、パスワード、性別、名前、住所、教育、大学、携帯電話を)属性を持つ私は、ユーザーテーブルを持っています。それはこの

教師(ユーザーID、コース)のようなマッピングの後に来る

と教師のテーブル。

とヘッドマスターテーブル。 headmaster(UserId、Years_Of_Service)。

プライマリキーなしで教師テーブルとヘッドマスターテーブルを作成したとき、各テーブルにUserId属性のインデックスを追加し、UserテーブルのUserIdを参照しました。

私の質問:MySQLを使用してテーブルのディスジョイントをどのように実装できますか?それをやっての

事前に感謝

答えて

0

一つの方法は、あなたのテーブルのそれぞれに種類の指標を追加するだけでなく、タイプのインジケータを含むFK制約することです。

私は、スーパータイプと1つのサブタイプテーブルを表示します。

CREATE TABLE `User` (
    `UserID` bigint(21) NOT NULL, 
    `UserType` enum('H', 'T') NOT NULL, 
    ... 
    PRIMARY KEY (`UserID`), 
    UNIQUE KEY (`UserID`,`UserType`) 
) ENGINE=InnoDB; 

CREATE TABLE `Teacher` (
    `UserID` bigint(21) NOT NULL, 
    `UserType` enum('H', 'T') NOT NULL, 
    ... 
    PRIMARY KEY (`UserID`), 
    FOREIGN KEY (`UserID`, `UserType`) REFERENCES `User` (`UserID`, `UserType`) ON UPDATE CASCADE 
) ENGINE=InnoDB; 

UserType列がFK制約を作成するためにスーパータイプとサブタイプテーブルで同じように定義されなければならないことに留意されたいです。私はUserテーブルにユニークなキーを追加して、サブタイプの複合FK制約をサポートしました。各サブタイプテーブルのタイプインジケータを制限するために、我々はその後、トリガーの作成:

DELIMITER ;; 

CREATE TRIGGER check_teacher_insert BEFORE INSERT ON Teacher 
    FOR EACH ROW 
    BEGIN 
     IF new.UserType != 'T' THEN 
      SIGNAL SQLSTATE '45000' 
      SET MESSAGE_TEXT = 'Invalid UserType in Teacher'; 
     END IF; 
    END; 
;; 

CREATE TRIGGER check_teacher_update BEFORE UPDATE ON Teacher 
    FOR EACH ROW 
    BEGIN 
     IF new.UserType != 'T' THEN 
      SIGNAL SQLSTATE '45000' 
      SET MESSAGE_TEXT = 'Invalid UserType in Teacher'; 
     END IF; 
    END; 
;; 

DELIMITER ; 

を別のアプローチは、タイプ・インジケータを除外することであり、単にトリガーを使用:

DELIMITER ;; 

CREATE TRIGGER check_teacher_insert BEFORE INSERT ON Teacher 
    FOR EACH ROW 
    BEGIN 
     IF EXISTS (
      SELECT 1 
      FROM Headmaster 
      WHERE UserID = new.UserID 
     ) THEN 
      SIGNAL SQLSTATE '45000' 
      SET MESSAGE_TEXT = 'Invalid UserID in Teacher - already exists in HeadMaster'; 
     END IF; 
    END; 
;; 

CREATE TRIGGER check_teacher_update BEFORE UPDATE ON Teacher 
    FOR EACH ROW 
    BEGIN 
     IF EXISTS (
      SELECT 1 
      FROM Headmaster 
      WHERE UserID = new.UserID 
     ) THEN 
      SIGNAL SQLSTATE '45000' 
      SET MESSAGE_TEXT = 'Invalid UserID in Teacher - already exists in HeadMaster'; 
     END IF; 
    END; 
;; 

DELIMITER ; 
関連する問題