mysql - 使用外键在 MySQL 中建模 ISA 关系

标签 mysql database-design model foreign-keys

如何为 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/

相关文章:

php - 如何从一对多关系中使用 SQL 获取平均税率

java - 像 Java 中的 select 一样实现 SQL

database-design - 单独的客户帐户的单个或单独的数据库?

mysql - 两个可能表的外键

ruby - 两个连接表的续集模型

Python:无法识别 Django 模型中的更改

swift - 从类外的模型文件激活类上的 segue?实例成员不能用于类型

php - MySQL 中的外键是强制性的吗?

php - 违反完整性约束 : 1452 Cannot add or update a child row in Laravel 5. 2

mysql - 加入没有公共(public)键的多个表