外键引用多个主键值(来自一个表) - Oracle SQL PLUS

时间:2014-01-03 17:39:03

标签: sql database oracle

我仍然是SQL的初学者,我正面临着一个问题。希望您能够帮助我。 我有一个名为Department的表,它有一个DEPARTMENT_NO属性作为主键。

CREATE TABLE DEPARTMENT(
 DEPARTMENT_NO INT NOT NULL,
 NAME VARCHAR(25) NOT NULL,
 LOCATION CHAR(15),
 PRIMARY KEY(DEPARTMENT_NO));

我有另一个名为Doctor的表,其中有一个属性DNUM作为引用DEPARTMENT_NO的外键:

CREATE TABLE DOCTOR(
 DOCTOR_ID CHAR(9) NOT NULL,
 DNUM INT NOT NULL,
 NAME VARCHAR(20) NOT NULL,
 DOB DATE,
 SPECIALTY VARCHAR(20) NOT NULL,
 SALARY INT,
 CITY VARCHAR(15),
 STREET VARCHAR(15),
 START_DATE DATE,
 PRIMARY KEY(DOCTOR_ID))
 FOREIGN KEY(DNUM) REFERENCES DEPARTMENT(DEPARTMENT_NO));

医生可以在一个或两个部门工作。因此,如果我在第1和第4部门工作(DNUM的值将包括1和4)。

我最初选择DNUM的数据类型为INT(与DEPARTMENT_NO数据类型相同)。但INT对于多个值并不理想。

数据类型应该是什么?或者我有什么其他解决方案,例如,我运行查询以返回在部门4工作的医生的名字。 查询应返回在部门4(仅)工作的医生和在多个部门(包括4个)工作的医生的所有姓名。

非常感谢,并且抱歉留言。

3 个答案:

答案 0 :(得分:1)

您需要一个名为doctor_department的附加表

create table doctor_department
(doctor_id integer references doctor(doctor_id) not null,
 dnum integer references department(dnum) not null
)

答案 1 :(得分:1)

您可以创建与这两个表相关的另一个表 说,

Create table Dept_Doctors(
ID int not null,
DOCTOR_ID char(9) not null,
DEPARTMENT_NO INT NOT NULL,
PRIMARY KEY (ID),
FOREIGN KEY(DEPARTMENT_NO) REFERENCES DEPARTMENT(DEPARTMENT_NO),
FOREIGN KEY(DOCTOR_ID) REFERENCES DOCTOR(DOCTOR_ID));

您可以加入3个表格并获得所需的结果。

答案 2 :(得分:1)

表示“多对多”关系的标准方式是通过“交汇点”(又名“链接”)表:

CREATE TABLE DOCTOR_DEPARTMENT (
    DOCTOR_ID INT REFERENCES DOCTOR(DOCTOR_ID),
    DEPARTMENT_NO INT REFERENCES DEPARTMENT (DEPARTMENT_NO),
    PRIMARY KEY (DOCTOR_ID, DEPARTMENT_NO)
);

请注意{DOCTOR_ID,DEPARTMENT_NO}上的密钥,以确保同一位医生无法连接到同一个部门两次。

它还隐式地在这些字段中按顺序创建了一个复合(也称为“连接”)索引,这使得查找给定医生的部门(通过索引范围扫描)非常快速。如果您需要在相反的“方向”(对于给定部门的医生)查询,请翻转字段的顺序。如果您需要两个查询,那么您将需要两个索引(即您需要显式创建一个索引)。

如果只需要其中一个索引,请考虑添加ORGANIZATION INDEX子句。