Внешний ключ в SQL - PullRequest
       1

Внешний ключ в SQL

2 голосов
/ 09 января 2012

У меня есть таблица:

PROFESSOR(pid, pname)  

и другая таблица:

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

Я хочу сослаться professorID,assistantID and examinerID на pid. Профессор может быть ассистентом на экзамене и экзаменатором, а предмет принадлежит профессору, поэтому профессора, ассистенты и экзаменаторы в таблице EXAM выбираются из числа профессоров в таблице PROFESSOR.

Я думаю, что разработанная мной схема неверна, не так ли? Если неправильно, как это изменить, чтобы я мог выполнить условие, которое я объяснил выше.

Можете ли вы помочь, пожалуйста?

Ответы [ 5 ]

1 голос
/ 09 января 2012

Я думаю, что схема может быть изменена.Вы можете иметь три таблицы: -

Преподаватель (pid, pname, pAddr);

Экзамен (examId, subjectId, ..., .., assistantId, ExaminerId);(assistantId и ExaminerId ссылаются на pId)

Тема (subjectId, desc, course, ProfessorId);(ProfessorId ссылается на PID)

0 голосов
/ 17 января 2012

Спасибо всем, я хотел, чтобы assistantID, ProfessorID и examinerID ссылались на PID. Я использовал Navicat для визуального оформления таблиц, и он не работал должным образом. Я протестировал то же самое в sqlserver и mysql (используя workbench) и в бинго это сработало.

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;

на данный момент я просто опустил тему, потому что она требует лучшего дизайна схемы.

0 голосов
/ 09 января 2012

Вы можете:

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`);
0 голосов
/ 09 января 2012

Я думаю, что схема уже достаточно основана на нужных ему отношениях («Профессор может быть ассистентом на экзамене и быть экзаменатором»). Затем он мог бы напрямую использовать pid для столбцов ProfessorID, assistanID и examinerID, но, тем не менее, вместо этого предмет должен быть отдельной таблицей, но каким-то образом не уверен в других деталях, которые вам нужны для таблицы преподавателей, было бы больше подробностей о фактическая реализация для этого, но в любом случае важно то, что всего несколько настроек, и вы будете иметь хорошие отношения на ходу. :)

0 голосов
/ 09 января 2012

Ваша схема неверна.

Вы должны определить три таблицы. Профессор, экзамен и предмет.

Для ассистента и экзаменатора вы должны определить столбец в таблице профессора «роль». Ролевая колонка будет определять, является ли профессор профессором, экзаменатором или ассистентом. Внешний ключ таблицы профессора будет входить в обе другие таблицы. т.е. предмет и экзамен.

Думаю, это очень поможет вам в создании столов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...