一つの方法は、あなたのテーブルのそれぞれに種類の指標を追加するだけでなく、タイプのインジケータを含む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 ;