【问题标题】:sql trouble creating table (foreign/ref key)(oracle)sql 创建表时遇到问题(外/引用键)(oracle)
【发布时间】:2015-10-07 01:34:28
【问题描述】:

无法找出这些错误。在这方面工作太久了,请帮忙,我已经坚持了大约 4 个小时。

CREATE TABLE Student
(
student_id varchar(25),
student_name varchar(25),
major varchar(10),
gpa number(3,2),
PRIMARY KEY(student_id)
);


CREATE TABLE Class
(
schedule_num varchar(25),
semester varchar(25),
course_name varchar(25),
course_number varchar(25),
credit varchar(4),
department varchar(25),
meeting_time varchar(25),
meeting_place varchar(25),
class_size_limit varchar (25),
PRIMARY KEY(schedule_num,semester)
);


CREATE TABLE Enrolls
(
semester varchar(25),
grade varchar(2),
PRIMARY KEY(student_id,schedule_num,semester),
student_id varchar(25) FOREIGN KEY REFERENCES Student(student_id),
schedule_num varchar(25) FOREIGN KEY REFERENCES Class(schedule_num),
);

2 个错误---

1) 错误 - 缺少右括号第 6 行
2) ERROR -- 表或视图不存在第 1 行

【问题讨论】:

  • 我假设您在定义 enrolls 表时遇到了错误。主键定义看起来不合理——键的三个组成部分实际上都不是表中的列。你也不会使用FOREIGN KEY REFERENCES,语法就是REFERENCES。我希望您想使用 varchar2 而不是 varchar 但这不会导致您的问题。
  • 所以我们根本不需要外键?你说的看起来不明智是什么意思?
  • 您尝试在enrolls 上定义复合主键。该复合键由三列组成 - student_id、schedule_num 和 semester。 student_id 不是表中的列。 schedule_num 不是表中的列。主键包含不存在的列是没有意义的。要么你想在你的表中包含这些列(这看起来很明智),要么你想以不同的方式定义键。定义内联外键约束的语法不包括字面词foreign key,只包括x references tbl(x)。

标签: sql oracle foreign-keys primary-key


【解决方案1】:

在 Oracle 中,您应该使用 varchar2() 而不是 varchar()(出于非常神秘和历史原因)。

定义外键和主键时:

  • 外键需要与主键完全匹配。
  • references 关键字在与列定义内联时不使用 foreign key。
  • 不能在行中声明复合外键。
  • 需要先定义列,然后才能在约束中使用它。

Here 是一个修复这些问题的 SQL Fiddle:

CREATE TABLE Student (
    student_id varchar2(25),
    student_name varchar2(25),
    major varchar2(10),
    gpa number(3,2),
    PRIMARY KEY(student_id)
);


CREATE TABLE Class (
    schedule_num varchar2(25),
    semester varchar2(25),
    course_name varchar2(25),
    course_number varchar2(25),
    credit varchar2(4),
    department varchar2(25),
    meeting_time varchar2(25),
    meeting_place varchar2(25),
    class_size_limit varchar2(25),
    PRIMARY KEY(schedule_num, semester)
);

CREATE TABLE Enrolls (
    semester varchar2(25),
    grade varchar2(2),
    student_id varchar2(25) REFERENCES Student(student_id),
    schedule_num varchar2(25),
    FOREIGN KEY (schedule_num, semester) REFERENCES Class(schedule_num, semester),
    PRIMARY KEY(student_id ,schedule_num, semester)
);

【讨论】:

    【解决方案2】:

    您在倒数第二行的末尾添加了一个额外的逗号。 schedule_num varchar(25) FOREIGN KEY REFERENCES Class(schedule_num),

    逗号可能导致这两个错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-26
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多