2013-11-28 41 views
1

如何模擬ISA類? 'Persoon'ISA'學生'或'Docent',你如何在MySQL中建模? 我試圖做一個Persoon類,有2個字段,然後你可以把學生/講解員的ID放在正確的字段中。另一個是零。使用外鍵在MySQL中建立一個ISA關係

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) 

回答

2

你向後做 - 從「特定」表的外鍵應該引用「常規」表。

你的情況: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

同上。