2017-03-06 6 views
0

교사 또는 교장이 될 수있는 사용자 테이블이 My ER diagram 입니다. 나는 분리 된 전문화가 응급실에서 적절하다고 생각합니다. MySQL dbms를 사용하고 User 테이블 (예 : UserId = 31)에서 사용자를 생성 한 테이블을 생성 한 후. 하지만 문제는 UserId = 31 인 교사용 테이블에 새 레코드를 삽입하고 headmaster 테이블에 동일한 UserId를 삽입해도 오류가 발생하지 않는 경우입니다. 나는 이것이 분리 된 재산에 대한 위반이라고 생각한다. 이ER 다이어그램의 매핑 전문화, 하위 테이블에 중복 삽입

사용자 (사용자 아이디, 사용자 이름, 비밀번호, 성별, 이름, 주소, 교육, 대학, 모바일) 속성과

나는 사용자 테이블이있다. 그것은이

교사 (사용자 아이디, 과정)와 같은 매핑 다음에 오는

교사 테이블.

및 헤드 마스터 테이블. 교장 (UserId, Years_Of_Service).

기본 키없이 교사 및 교장 용 테이블을 만들었 으면 각 테이블에 UserId 속성에 대한 색인을 추가하고 User 테이블의 UserId를 참조하도록 설정합니다.

내 질문 : 어떻게 MySQL을 사용하여 내 테이블에 대한 disjoint 구현할 수 있습니까? 사전에

감사 그것이 당신의 테이블의 각 유형 지표뿐만 아니라 유형 지표를 포함 FK 제약 조건을 추가하는 일을

답변

0

한 가지 방법.

저는 하나의 서브 타입 테이블뿐만 아니라 슈퍼 타입도 보여줄 것입니다. UserType 열이 FK 제약 조건을 만들기 위해 슈퍼 타입과 서브 타입 테이블에 같은 방식으로 정의해야한다는

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; 

참고. 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 ;