Почему я нарушаю ограничение целостности? (ORA-02291)

#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