Ошибки в моем скрипте создания схемы - PullRequest
0 голосов
/ 24 апреля 2011

Итак, у меня есть простой сценарий 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-ордера выполняются правильно.Вот что я получаю:

enter image description here

Что это значит?Я что-то не так делаю?

1 Ответ

5 голосов
/ 24 апреля 2011

/ в 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 выполняется из-за точки с запятой, и как / выполняет его снова.

...