的一种方式。
我只是要显示超类型以及一个子类型表。
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 ;