在多个表oracle中分配主键和外键

时间:2015-09-18 20:57:20

标签: sql oracle foreign-keys primary-key

我刚刚在Oracle SQL中启动了一个类,我们获得了创建3个实体和2个关系表的赋值。他给了我们这些领域并说我们觉得有必要加上:

Course: department, semester, maximumEnrolled
Instructor: firstName, lastName, ssn
Room: roomNumber, building
Teaches: instructor, course
Uses: course, room

当我创建表时,只有前4个工作,但我无法创建使用表。错误是:

  

ORA-02270:此列列表没有匹配的唯一键或主键。

这就是我所做的:

CREATE TABLE course
    (course_id NUMBER(4) PRIMARY KEY,
    courseName VARCHAR2(30) NOT NULL,
    department VARCHAR2(50),
    semester VARCHAR2(10),
    maximumEnrolled NUMBER(36) NOT NULL);

CREATE TABLE room
    (roomNo NUMBER(5) PRIMARY KEY,
    building VARCHAR2(10));

CREATE TABLE instructor
    (instructor_id NUMBER(6) PRIMARY KEY,
    firstName VARCHAR2(20),
    lastName VARCHAR2(30) NOT NULL
    ssn NUMBER(9) NOT NULL);

CREATE TABLE teaches
    (instructor_id NUMBER(5) NOT NULL,
    course_id NUMBER(4) NOT NULL,
    teachingCourse VARCHAR2(4) PRIMARY KEY, 
    CONSTRAINT instructor_fk FOREIGN KEY (instructor_id) REFERENCES instructor (instructor_id)
    CONSTRAINT course_fk FOREIGN KEY (course_id) REFERENCES course (course_id));

CREATE TABLE uses
    (course_id NUMBER(4) NOT NULL,
    roomNo NUMBER(5) NOT NULL,
    roomUse VARCHAR2(4) PRIMARY KEY,
    CONSTRAINT course_fk FOREIGN KEY (course_id) REFERENCES course (course_id)
    CONSTRAINT room_fk FOREIGN KEY (roomNo) REFERENCES room (roomNo));

我想也许问题是我在教学表中使用course_id作为FK所以我试过了:

CREATE TABLE uses
  (roomUsage VARCHAR2(30) PRIMARY KEY,
  roomNo NUMBER(5) NOT NULL,
  courseName VARCHAR2(30) NOT NULL,
  CONSTRAINT room_fk FOREIGN KEY (roomNo) REFERENCES room (roomNo),
  CONSTRAINT course_fk FOREIGN KEY (courseName) REFERENCES course (courseName));

但它既没有奏效也给出了同样的错误。我做错了什么?

1 个答案:

答案 0 :(得分:1)

您的某些表定义中缺少一些逗号(在lastname中的instructor之后,在最后两个表中的第一个fk之后)以及数据类型不匹配(大小) instructor_id中的teaches。此外,外键约束名称必须是唯一的 - 您正在course_fk表中重用uses - 重命名它。

更正的代码是:

CREATE TABLE course
    (course_id NUMBER(4) PRIMARY KEY,
    courseName VARCHAR2(30) NOT NULL,
    department VARCHAR2(50),
    semester VARCHAR2(10),
    maximumEnrolled NUMBER(36) NOT NULL
    );

CREATE TABLE room
    (roomNo NUMBER(5) PRIMARY KEY,
    building VARCHAR2(10));

CREATE TABLE instructor
    (instructor_id NUMBER(6) PRIMARY KEY,
    firstName VARCHAR2(20),
    lastName VARCHAR2(30) NOT NULL,
    ssn NUMBER(9) NOT NULL
    );

CREATE TABLE teaches
    (instructor_id NUMBER(6) NOT NULL,
    course_id NUMBER(4) NOT NULL,
    teachingCourse VARCHAR2(4) PRIMARY KEY, 
    CONSTRAINT instructor_fk FOREIGN KEY (instructor_id) REFERENCES instructor (instructor_id),
    CONSTRAINT course_fk FOREIGN KEY (course_id) REFERENCES course (course_id)
    );

CREATE TABLE uses
    (course_id NUMBER(4) NOT NULL,
    roomNo NUMBER(5) NOT NULL,
    roomUse VARCHAR2(4) PRIMARY KEY,
    CONSTRAINT course_fk2 FOREIGN KEY (course_id) REFERENCES course (course_id),
    CONSTRAINT room_fk FOREIGN KEY (roomNo) REFERENCES room (roomNo)
    );

Working SQL Fiddle