我的架构创建脚本中的错误

Ric*_*nop 0 sql oracle plsql sqlplus

所以我有一个简单的SQL脚本,它创建了一个简单的库在线目录的数据库模式:

DROP TABLE book_copies;
/
DROP TABLE books_authors_xref;
/
DROP TABLE authors;
/
DROP TABLE books;
/

CREATE TABLE books (
    isbn VARCHAR2(13) NOT NULL PRIMARY KEY,
    title VARCHAR2(200),
    summary VARCHAR2(2000),
    date_published DATE,
    page_count NUMBER
);
/

CREATE TABLE authors (
    name VARCHAR2(200) NOT NULL PRIMARY KEY
);
/

CREATE TABLE books_authors_xref (
    author_name VARCHAR2(200),
    book_isbn VARCHAR2(13),
    CONSTRAINT pk_books_authors_xref PRIMARY KEY (author_name, book_isbn),
    CONSTRAINT fk_books_authors_xref1 FOREIGN KEY (author_name) REFERENCES authors (name),
    CONSTRAINT fk_books_authors_xref2 FOREIGN KEY (book_isbn) REFERENCES books (isbn)
);
/

CREATE TABLE book_copies (
    barcode_id VARCHAR2(100) NOT NULL PRIMARY KEY,
    book_isbn VARCHAR2(13),
    CONSTRAINT fk_book_copies FOREIGN KEY (book_isbn) REFERENCES books (isbn)
);
/
Run Code Online (Sandbox Code Playgroud)

每当我通过SQL*Plus运行它时,即使看起来所有SQL命令都正确执行,我在执行期间会遇到很多错误.这是我得到的输出:

在此输入图像描述

那是什么意思?难道我做错了什么?

a_h*_*ame 5

/在SQL*Plus执行"在buffer命令".以分号结束的语句将被执行并放入缓冲区.

所以CREATE TABLE books ....实际上是两次运行.第一次因为分号;(将语句放入缓冲区)和第二次解析器命中/.

这就是为什么你得到"名称已被使用"的错误.

所以你需要使用分号斜杠,但不能同时使用两者.

编辑
您可以看到在使用两者手动运行语句时发生了什么,在以下日志中,我将脚本中的第一个语句复制并粘贴到SQL*Plus控制台:

SQL> DROP TABLE book_copies;

Table dropped.

SQL> /
DROP TABLE book_copies
           *
ERROR at line 1:
ORA-00942: table or view does not exist

您可以清楚地看到DROP TABLE由于分号而/执行的方式,以及如何再次执行它.

  • 我更喜欢使用分号,因为这使脚本更具可移植性.但是当你运行它的唯一环境是SQL*Plus时,它并没有真正有所作为. (2认同)