#sql #database #oracle
#sql #База данных #Oracle
Вопрос:
Когда я пытаюсь изменить одну из своих таблиц, чтобы установить одну из ее строк в качестве внешнего ключа, я получаю следующую ошибку: «ORA-02291: ограничение целостности (SYSTEM.M_FRAN_FK) нарушено — родительский ключ не найден»
Эта ошибка возникает только тогда, когда я вставляю строку в базу данных со значением none-null . Я пытаюсь понять, почему он это делает и что именно я делаю неправильно. Вот код sql;
CREATE TABLE Movie(
Movie_Title VARCHAR2(30) CONSTRAINT movie_title_pk PRIMARY KEY,
Screen_Time Number(3),
M_Reviews NUMBER(2,1),
Fran_Name VARCHAR2(30));
CREATE TABLE Franchise(
Fran_Name VARCHAR2(30) CONSTRAINT fran_name_pk PRIMARY KEY);
ALTER TABLE Movie
ADD CONSTRAINT m_fran_fk FOREIGN KEY(Fran_Name)
REFERENCES Franchise(Fran_Name);
--this is fine
INSERT INTO Movie
VALUES('Hubie Halloween', 102, 5.2, '');
--this is also fine
INSERT INTO Movie
VALUES('Titanic', 194, 7.8, '');
--this is NOT fine
INSERT INTO Movie
VALUES('Iron Man 2', 124, 7.0, 'Marvel: Iron Man');
Комментарии:
1. Это вопрос домашнего задания или реальная производственная база данных? Потому что использование только названия фильма в качестве естественного ключа не является хорошей идеей (поскольку несколько разных фильмов могут иметь одно и то же название, а один и тот же фильм может иметь разные названия, особенно локализованные названия)
2. Домашнее задание / проект, просто практическая база данных на самом деле
Ответ №1:
Вам нужно, чтобы франшиза «Marvel: Железный человек» существовала до того, как вы вставите в нее «Железного человека» Movie
.
Кроме того, вы всегда должны использовать явные имена столбцов в INSERT
операторах.
INSERT INTO Franchise ( Fran_Name )
VALUES ( 'Marvel: Iron Man' )
INSERT INTO Movie ( Movie_Title, Screen_Time, M_Reviews, Fran_name )
VALUES( 'Iron Man 2', 124, 7.0, 'Marvel: Iron Man' );
… и что более спорно, я считаю, что таблицы базы данных должны иметь имена во множественном числе, если таблица представляет неограниченную коллекцию. (Я с нетерпением жду примерно дюжины ответов на комментарии от людей, которые не согласны 😉 )
Комментарии:
1. Спасибо! Сработало как шарм. Это был полный недосмотр с моей стороны, не имело бы смысла иметь внешний ключ к строке, которая не существует
2. «Всегда используйте явные столбцы» 1 Однако я должен признать, что с точки зрения объектно-ориентированной перспективы имеет смысл использовать единственное число, особенно при использовании ORM.
3. @TheImpaler Каждый ORM, который я когда-либо использовал, поддерживает преобразование имен таблиц во множественном числе в существительные единственного числа.
4. Я имею в виду… вы напрашивались на спор: D