【问题标题】:SQL name error with foreign key in sql codeSQL 代码中带有外键的 SQL 名称错误
【发布时间】:2018-12-08 02:58:07
【问题描述】:

我收到 ORA-00955 错误,即名称已被现有对象使用。我知道它在我试图使用的外键约束中。它发生在两个外键约束中。我不知道为什么会这样。我尝试将它们重命名为任何可能的名称,但我不明白为什么它不起作用。

DROP TABLE STUDENT;
CREATE TABLE STUDENT
(stuID VARCHAR (7) PRIMARY KEY NOT NULL,
major VARCHAR (15) NOT NULL,
firstName VARCHAR (15) NOT NULL,
lastName VARCHAR (15) NOT NULL,
yr  VARCHAR(8) NOT NULL
);

DROP TABLE ENROLL;
CREATE TABLE ENROLL
(stuID VARCHAR (7) NOT NULL,
grade VARCHAR (1) NOT NULL,
courseID VARCHAR(7) NOT NULL,
  CONSTRAINT fk_STUDENT
   FOREIGN KEY (stuID)
   REFERENCES STUDENT(stuid)
);

DROP TABLE CLASS;
CREATE TABLE CLASS
(instructorID VARCHAR(7) NOT NULL,
classRoomNumber VARCHAR(7) NOT NULL,
dateStarts DATE NOT NULL,
courseID VARCHAR(7) PRIMARY KEY NOT NULL,
description CHAR(100) NOT NULL,
 CONSTRAINT fk_INSTRUCTOR
  FOREIGN KEY (instructorID)
  REFERENCES INSTRUCTOR(instructorid)
);

DROP TABLE INSTRUCTOR;
CREATE TABLE INSTRUCTOR
(firstName VARCHAR (15) NOT NULL,
lastName VARCHAR (15) NOT NULL,
departmentName VARCHAR (15) NOT NULL,
instructorID VARCHAR(7) PRIMARY KEY NOT NULL
);

【问题讨论】:

  • 您无法定义对尚不存在的表的引用。将instructor 放在class 上方
  • 我这样做了,但我仍然遇到同样的错误

标签: sql oracle


【解决方案1】:

在评论中,您说仍然存在错误。

如果您以正确的顺序创建(和/或删除)表,则一切正常。我更喜欢单独丢弃它们。

起初,表不存在,所以我将创建它们:

SQL> CREATE TABLE student (
  2    stuid       VARCHAR(7) PRIMARY KEY NOT NULL,
  3    major       VARCHAR(15) NOT NULL,
  4    firstname   VARCHAR(15) NOT NULL,
  5    lastname    VARCHAR(15) NOT NULL,
  6    yr          VARCHAR(8) NOT NULL
  7  );

Table created.

SQL> CREATE TABLE enroll (
  2    stuid      VARCHAR(7) NOT NULL,
  3    grade      VARCHAR(1) NOT NULL,
  4    courseid   VARCHAR(7) NOT NULL,
  5    CONSTRAINT fk_student FOREIGN KEY ( stuid )
  6      REFERENCES student ( stuid )
  7  );

Table created.

SQL> CREATE TABLE instructor (
  2    firstname        VARCHAR(15) NOT NULL,
  3    lastname         VARCHAR(15) NOT NULL,
  4    departmentname   VARCHAR(15) NOT NULL,
  5    instructorid     VARCHAR(7) PRIMARY KEY NOT NULL
  6  );

Table created.

SQL> CREATE TABLE class (
  2    instructorid      VARCHAR(7) NOT NULL,
  3    classroomnumber   VARCHAR(7) NOT NULL,
  4    datestarts        DATE NOT NULL,
  5    courseid          VARCHAR(7) PRIMARY KEY NOT NULL,
  6    description       CHAR(100) NOT NULL,
  7    CONSTRAINT fk_instructor FOREIGN KEY ( instructorid )
  8      REFERENCES instructor ( instructorid )
  9  );

Table created.

以相反的顺序删除表,以便在其主节点之前删除详细信息

SQL> DROP TABLE enroll;

Table dropped.

SQL> DROP TABLE student;

Table dropped.

SQL> DROP TABLE class;

Table dropped.

SQL> DROP TABLE instructor;

Table dropped.

SQL>

【讨论】:

    【解决方案2】:

    INSTRUCTOR 被表CLASS 引用,因此您要注意创建表INSTRUCTOR 创建表CLASS

    此外,您应该使用DROP TABLE ... CASCADE CONSTRAINTS 而不仅仅是DROP TABLE ...。这允许外键和主键与表同时被正确删除,并且可能避免您当前遇到的错误name already used by existing object

    【讨论】:

      猜你喜欢
      • 2019-12-15
      • 2023-03-27
      • 2013-11-21
      • 1970-01-01
      • 2021-03-10
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多