所以我有一个简单的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)
);
/
每当我通过SQL * Plus运行它时,即使看起来所有SQL命令都正确执行,我在执行期间会遇到很多错误。这是我得到的输出:
这是什么意思?我做错了吗?
答案 0 :(得分:5)
SQL * Plus中的/
执行“缓冲区中的命令”。以分号结束的语句将执行并放入缓冲区。
所以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
是如何执行的,因为分号以及/
如何再次执行它。