SQL中的外键

时间:2012-01-09 04:58:04

标签: mysql sql

我有一张桌子:

PROFESSOR(pid, pname)  

和另一张表:

EXAM(examid, professorID, assistantID , examinerID, subject);

我想将professorID,assistantID and examinerID引用到pid。教授可以是考试助理,也可以是考官,主题也属于教授,EXAM表中的教授,助理和考官都是从PROFESSOR表中的教授中选出的。

我认为我设计的架构是错的,是吗?如果它的错误如何改变它,以便我能满足上面解释的条件。

你能帮帮忙吗?

5 个答案:

答案 0 :(得分:1)

我认为架构可以重新设计。您可以有三个表: -

教授(pid,pname,pAddr);

考试(examId,subjectId,...,..,assistantId,ExaminerId); (assistantId和ExaminerId引用pId)

主题(subjectId,desc,course,professorId); (教授参考pId)

答案 1 :(得分:0)

您的架构错误。

您应该定义三个表。教授,考试和科目。

对于助理和考官,您应该在教授表'角色'中定义一列。角色列将定义教授是教授,考官还是助理。教授表外键将进入其他两个表。主题和考试。

我认为它可以帮助你制作表格。

答案 2 :(得分:0)

我认为模式已经足够基于他所需要的关系(“教授可以成为考试助理并成为考官”)。然后他可以直接在列的教授ID,assistanID和examinerID上使用pid,但是然后主题应该是一个单独的表,但是不知道怎么不确定教授表需要的其他细节那里会有更多细节。实际的实现,但无论如何重要的是只有几个tweek,你会在旅途中有一个良好的关系。 :)

答案 3 :(得分:0)

你可以:

SELECT
       `exam`.`examID`
    , COALESCE(`professor`.`pName`,'') AS ProfessorName
    , COALESCE(`professor_2`.`pName`,'') AS AssistantName
    ,  COALESCE(`professor_1`.`pName`, '') AS ExaminerName
    , `exam`.`iSubject`
FROM
    `sampledb`.`exam`
    LEFT JOIN `sampledb`.`professor` 
        ON (`exam`.`professorID` = `professor`.`pID`)
    LEFT JOIN `sampledb`.`professor` AS `professor_1`
        ON (`exam`.`assistantID` = `professor_1`.`pID`)
    LEFT JOIN `sampledb`.`professor` AS `professor_2`
        ON (`exam`.`examinerID` = `professor_2`.`pID`);

答案 4 :(得分:0)

谢谢大家,我希望使用assistantID,professorID和examinerID来引用PID。我正在使用Navicat在视觉上设计表格,但它无法正常工作。我在sqlserver和mysql中测试了同样的东西(使用workbench)和bingo它的工作原理。

CREATE TABLE `exam` (
  `examID` int(11) NOT NULL,
  `pID` int(11) DEFAULT NULL,
  `assistantID` int(11) DEFAULT NULL,
  `examinerID` int(11) DEFAULT NULL,
  PRIMARY KEY (`examID`),
  KEY `professor` (`pID`),
  KEY `assistant` (`assistantID`),
  KEY `examiner` (`examinerID`),
  CONSTRAINT `assistant` FOREIGN KEY (`assistantID`) REFERENCES `professor` (`pid`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `examiner` FOREIGN KEY (`examinerID`) REFERENCES `professor` (`pid`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `professor` FOREIGN KEY (`pID`) REFERENCES `professor` (`pid`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

现在我只是省略了主题,因为它需要更好的架构设计。