【问题标题】:Model a ISA relation in MySQL with Foreign Keys使用外键在 MySQL 中建模 ISA 关系
【发布时间】:2013-11-28 15:05:28
【问题描述】:

如何为 ISA 类建模? 'Persoon' ISA 'Student' 或 'Docent',你如何在 MySQL 中建模? 我尝试制作一个带有 2 个字段的 Persoon 类,然后您可以将学生/讲师的 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) 

【问题讨论】:

    标签: mysql database-design model foreign-keys


    【解决方案1】:

    您正在倒退 - “特定”表中的 FOREIGN KEY 应该引用“常规”表。

    在您的情况下:Docent 应该引用 PersonStudent 也应该引用 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 使用相同的值。

    讲解员同上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多