gpt4 book ai didi

php - ER图的映射特化,插入子表时重复

转载 作者:行者123 更新时间:2023-11-29 19:16:59 24 4
gpt4 key购买 nike

我有一个用户表,他只能是老师或校长 My ER diagram 。我认为在急诊室中,不相交的特化是合适的。我正在使用 MySQL dbms,创建表后,我在 User 表中创建了一个用户(例如 UserId=31)。但问题是,当我将 UserId =31 的新记录插入到 Teacher 表中,并在 headmaster 表中插入相同的 UserId 时,它不会给出任何错误。我认为这被认为是对不相交属性(property)的侵犯。

我有一个具有此属性的用户表

用户(用户 ID、用户名、密码、性别、姓名、地址、教育背景、大学、手机)。

以及像这样映射后出现的教师表

老师(用户ID,类(class))。

和校长 table 。校长(用户 ID,服务年数)。

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

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

提前致谢

最佳答案

一种方法是向每个表添加类型指示符,以及包含类型指示符的 FK 约束。

我只是要显示父类(super class)型以及一个子类型表。

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 列必须在父类(super class)型和子类型表中以相同的方式定义,才能创建 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 ;

关于php - ER图的映射特化,插入子表时重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42631438/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com