如何为 ISA 类建模? “Persoon”ISA“Student”或“Docent”,您如何在 MySQL 中对其进行建模? 我试着制作一个 Persoon 类,有 2 个字段,然后你可以将学生/讲解员的 ID 放在正确的字段中。另一个为零。
CREATE TABLE IF NOT EXISTS `Docent` (
`docent_id` int(4) unsigned NOT NULL AUTO_INCREMENT,,
PRIMARY KEY (`docent_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `Persoon` (
`naam` varchar(50) NOT NULL,
`email` varchar(50) NOT NULL,
`wachtwoord` varchar(100) NOT NULL,
`student_id` int(4) unsigned DEFAULT NULL,
`docent_id` int(4) unsigned DEFAULT NULL,
PRIMARY KEY (`email`),
KEY `email` (`email`),
KEY `student_id` (`student_id`),
KEY `docent_id` (`docent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `Student` (
`student_id` int(4) unsigned NOT NULL AUTO_INCREMENT,
`studentnummer` int(20) NOT NULL,
`niveau` int(2) NOT NULL,
`notities` varchar(200) NOT NULL,
PRIMARY KEY (`student_id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
添加外键时,如下所示,出现#1452 错误。我查了一下,但没有找到解决方法。
ALTER TABLE `Persoon` ADD CONSTRAINT `Persoons_student_id` FOREIGN KEY ( `student_id` ) REFERENCES `software`.`Student` (`student_id`) ON DELETE CASCADE ON UPDATE CASCADE ;
ALTER TABLE `Persoon` ADD CONSTRAINT `Persoons_docent_id` FOREIGN KEY ( `docent_id` ) REFERENCES `software`.`Docent` (`docent_id`) ON DELETE CASCADE ON UPDATE CASCADE ;
给出这个错误:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`software`.<result 2 when explaining filename '#sql-c0_54eea'>, CONSTRAINT `Persoons_student_id` FOREIGN KEY (`student_id`) REFERENCES `Student` (`student_id`) ON DELETE CASCADE ON UPDATE CASC)
最佳答案
您正在倒退 - 来自“特定”表的 FOREIGN KEY 应该引用“通用”表。
在你的情况下:Docent
应该引用 Person
并且 Student
也应该引用 Person
,类似于:
CREATE TABLE IF NOT EXISTS Person (
person_id int(4) unsigned AUTO_INCREMENT,
-- Other fields...
PRIMARY KEY (person_id)
);
CREATE TABLE IF NOT EXISTS Student (
student_id int(4) unsigned,
-- Other fields...
PRIMARY KEY (student_id),
FOREIGN KEY (student_id)
REFERENCES Person (person_id)
ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE IF NOT EXISTS Docent (
docent_id int(4) unsigned,
-- Other fields...
PRIMARY KEY (docent_id),
FOREIGN KEY (docent_id)
REFERENCES Person (person_id)
ON DELETE CASCADE ON UPDATE CASCADE
);
通过以下方式插入新学生:
- 首先在
Person
中插入一行并获取生成的person_id
(例如通过 LAST_INSERT_ID )。 - 在
Student
中插入一行时,student_id
使用相同的值。
讲解员同上。
关于mysql - 使用外键在 MySQL 中建模 ISA 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20269351/