【问题标题】:SQL Foreign Key Help. ORA-00907 Missing right parenthesisSQL 外键帮助。 ORA-00907 缺少右括号
【发布时间】:2019-06-14 11:39:50
【问题描述】:

我是 SQL 新手,但我在 CourseEnrollments 表中的外键方面遇到了问题。

我不断收到错误报告 - ORA-00907: 缺少右括号 00907. 00000 - "缺少右括号 *原因: *行动:

似乎所有逗号和括号都已到位。

Create Table Students 
(
StudentID INT NOT NULL,
Lastname VARCHAR2(25),
Firstname VARCHAR2(20),
Email VARCHAR2(40),
Enrollmentdate DATE,
CONSTRAINT student_pk PRIMARY KEY (StudentID)
);

/* This is the creation of the Students table */

Create Table Faculty 
(
FacultyID INT NOT NULL,
Lastname VARCHAR2(25),
Firstname VARCHAR2(20),
Email VARCHAR2(40),
Hiredate DATE,
CONSTRAINT faculty_pk PRIMARY KEY (FacultyID)
);

/* This is the creation of the Faculty table */

Create Table Courses 
(
CourseID INT NOT NULL,
"Subject (e.g. SDEV)" VARCHAR2(20),
"Catalognbr (e.g. 350)" NUMBER,
"Title (e.g. Database Security)" VARCHAR2(40),
CONSTRAINT course_pk PRIMARY KEY (CourseID)
);

/* This is the creation of the Courses table */

Create Table CourseEnrollments 
(
EnrollmentID INT NOT NULL,
  CONSTRAINT fk_Students
  FOREIGN KEY (StudentID)
  REFERENCES Students(StudentID)
CONSTRAINT fk_Faculty
  FOREIGN KEY (FacultyID)
  REFERENCES Faculty(FacultyID)
CONSTRAINT fk_Courses
  FOREIGN KEY (CourseID)
  REFERENCES Courses(CourseID)
CONSTRAINT enrollment_pk PRIMARY KEY (EnrollmentID)
);

【问题讨论】:

  • 你确定用引号括起来的列名应该有括号而不是反斜杠吗?请检查一下。这可能是个问题,我不确定。
  • 我强烈建议您考虑重新创建 COURSES 表。不要使用双引号,也不要将列解释放入其名称中。你是否知道 - 每次你想从那个表中选择一些东西 - 你必须写 exactly select "Title (e.g Database security)" from COURSES >>> 并且它会失败,因为我没有在“例如”中加一个点并且没有在“安全”中使用大写“S”?这样的桌子是一场噩梦。您可以将 COMMENT 用于任何列,例如comment on column courses.title is 'e.g. database security';

标签: sql oracle


【解决方案1】:

首先应该明确定义需要约束的列,然后您可以定义约束。此外,当您定义多个约束时,它们需要用逗号分隔。 这是工作代码(其余代码已经可以了)。

Create Table CourseEnrollments 
(
EnrollmentID INT NOT NULL,
StudentID int,
FacultyID int,
CourseID int,
CONSTRAINT fk_Students
  FOREIGN KEY (StudentID)
  REFERENCES Students(StudentID),
CONSTRAINT fk_Faculty
  FOREIGN KEY (FacultyID)
  REFERENCES Faculty(FacultyID),
CONSTRAINT fk_Courses
  FOREIGN KEY (CourseID)
  REFERENCES Courses(CourseID),
CONSTRAINT enrollment_pk PRIMARY KEY (EnrollmentID)
);

【讨论】:

  • “剩下的代码已经没问题了” 到了一定程度。正如@Littelfoot 指出的那样,Courses 表的声明将通过编译,否则将是一场噩梦。
  • 我没有提出任何建议,只是提供了解决方案。毫无疑问,这是一个非常好的建议。
  • 为什么是int?我更喜欢列是数字。
【解决方案2】:

这条消息

ORA-00907: missing right parenthesis

... 总是表示语法错误。有时这真的意味着我们丢掉了一个括号。通常这意味着我们拼错了关键字或省略了一个元素,因此编译器会找到一个关键字或其他它不期望的东西。

在这种情况下,您省略了约束子句中的逗号。编译器期望表子句(列和约束声明)用逗号分隔。当涉及到一个这样的子句的结尾时,它正在寻找一个逗号;没有找到它期望的逗号 ) 指示表规范的结尾。相反,它找到了constraint,因此它抛出了 ORA-00907。

【讨论】:

    猜你喜欢
    • 2016-02-20
    • 2016-10-23
    • 2018-05-23
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2018-12-06
    相关资源
    最近更新 更多