Oracle SQL Проблема с операторами вставки - PullRequest
0 голосов
/ 11 сентября 2010

Так что я новичок в этом и пытаюсь следовать инструкциям моих профессоров, как это сделать. Они следующие:

Рассмотрим реляционную базу данных, описанную в таблицах 1-3. Подчеркнутый атрибут (ы) является первичным ключом для таблицы. Используйте свою учетную запись Oracle, чтобы создать эту базу данных и вставить кортежи, перечисленные в каждой таблице. Убедитесь, что вы включили ограничения первичного ключа и внешнего ключа. Поставьте контрольные ограничения на следующие три атрибута. Рейтинг (от 0 до 10), Lengith (больше 0), ReleaseDate (после 01.01.1900).

Таблица 1: Театры
Имя (подчеркнуто как основной), город, штат, почтовый индекс, телефон

Таблица 2: Фильмы
Заголовок (основной), рейтинг, длина, дата выпуска

Таблица 3: ShownAt
TheatreName, MovieTitle (ОБА указан в качестве основного)

Вот как я их объявил:

CREATE TABLE Theatres (
Name   varchar2(50) not null,
City   varchar2(50) not null,
State   varchar2(50) not null,
Zip   number not null,
Phone   varchar2(50) not null,
CONSTRAINT name_pk PRIMARY KEY (Name)
);

create table Movies (
Title   varchar2(100),
Rating NUMBER CONSTRAINT Rating_CHK CHECK (Rating BETWEEN 0 AND 10),
Length NUMBER CONSTRAINT Length_CHK CHECK (Length > 0),
ReleaseDate date CONSTRAINT RDATE_CHK CHECK (ReleaseDate > to_date('1/January/1900', 'DD/MONTH/YYYY')),
CONSTRAINT title_pk PRIMARY KEY (Title)
);

create table ShownAt (
TheatreName varchar2(50),
MovieTitle varchar2(100),
CONSTRAINT moviet_fk FOREIGN KEY (MovieTitle) REFERENCES Movies(Title),
CONSTRAINT shown_pk PRIMARY KEY (TheatreName, MovieTitle)
);

Это объявляет нормально, и я не получаю ошибок. Ниже приведены мои вставки (я дал один пример вставки для каждой таблицы):

insert into theatres values ( 'Great Escape 14', 'Wilder', 'KY', '41076', '(859) 442-0000' );
insert into movies values ( 'The Expendables', '7.6', '103', '13 August 2010' );
insert into shownat values ( 'Great Escape 14', 'The Expendables' );

Все вставки в кинотеатры и фильмы проходят без помех. Для ShownAt я получаю МНОГО ОШИБОК, большинство из которых выглядят примерно так:

Error starting at line 37 in command:
insert into shownat values ( 'Showcase Cinema De Lux Florence', 'The Pianist' )
Error report:
SQL Error: ORA-02291: integrity constraint (LANGB1.MOVIET_FK) violated - parent key not found

Значение:

02291. 00000 - "integrity constraint (%s.%s) violated - parent key not found"
*Cause:    A foreign key value has no matching primary key value.
*Action:   Delete the foreign key or add a matching primary key.

Любая вставка в ShownAt, где заголовок - это всего одно слово (скажем, фильм «Вверх»), работает нормально, но все, что содержит более одного слова (например, «Неудержимые»), не будет выполнено и выдает вышеуказанную ошибку. Любая помощь приветствуется. Я могу опубликовать любые другие детали, которые вам нужны.

1 Ответ

1 голос
/ 11 сентября 2010

Не существует технической причины, по которой первичный ключ, состоящий из нескольких слов, должен выходить из строя при успешном использовании ключа из одного слова.

Обычно рекомендуется избегать использования длинного VARCHAR2 (или любого типа данных строки) для столбцов первичного ключа. Это потому, что легче вводить ошибки с несоответствующим регистром или лишними пробелами. Ниже приведены все различные значения: 'The Pianist', 'The pianist', 'The Pianist '.

Таким образом, одним из объяснений сбоя некоторых вставок в ShownAt являются ошибки транскрипции: дополнительная сложность многословного ключа в смешанном регистре повышает вероятность того, что вы не совсем правильно поняли ключи в ошибочных операторах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...