2017-03-06 40 views
0

我有一个用户表,他可以是教师或校长只有My ER diagram 。我认为这是不合适的专业化,它适合于ER。我正在使用MySQL dbms,创建表后,我在User表中创建了一个用户(例如UserId = 31)。但问题是当我用UserId = 31向老师表插入一条新记录并在headmaster表中插入相同的UserId时,它不会给出任何错误。我认为这被认为是对不相交财产的违规。映射ER图的专业化,重复插入到子表

我有一个用户表,这个属性

用户(用户ID,用户名,密码,性别,姓名,地址,教育,大学,移动)。它涉及这样

老师(用户ID,课程)映射后

和教师表。

和校长表。 headmaster(UserId,Years_Of_Service)。

当我创建教师和校长表时,我创建了他们没有主键,然后我在每个表中添加UserId属性的索引,并使其引用UserId在用户表中。

我的问题:如何使用MySQL实现我的表的不相交?

感谢事先做它是添加型指标到每个表,以及包括类型指标FK约束

回答

0

的一种方式。

我只是要显示超类型以及一个子类型表。

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 ;