2016-11-22 1 views
0

2 Таблицы:SQL Constraint удаления не удаляет ребенка, но дает ошибку

CREATE TABLE movie (
    ID  int PRIMARY KEY, 
    name varchar2(50) NOT NULL 
); 

CREATE TABLE length (
    ID  int PRIMARY KEY REFERENCES movie(ID) ON DELETE CASCADE, 
    length int NOT NULL 
); 

Так что я попытался удалить значения от обоих:

delete from movie where ID=1; 

но получаю ошибку:

"attempted to delete a parent key value that had a foreign dependency." 

Почему, если я использую ON DELETE CASCADE?

+1

Какие СУБД вы фактически используете? varchar2 НЕ является допустимым типом сервера sql-сервера. Это Oracle? –

+0

К сожалению, это Oracle (разработчик SQL) – Linz

+0

Опция 'CASCADE' работает в другом направлении. Если вы удалите по длине, он удалит ссылки на строки в дочерней таблице. Проверьте определение отношений. – Alfabravo

ответ

1

Я думаю, что в ваших отношениях есть ошибка. Кажется, это отношение «один ко многим», а FK находится в таблице lenght, что означает, что фильм имеет много длин. Это то, что вы имели в виду?

Обычно length может быть размещен как атрибут таблицы movie. Но если вы хотите сохранить этот атрибут в виде разделенной таблицы, я бы предложил вам создать FK в вашем столовом фильме, который ссылается на таблицу length.

CREATE TABLE movie (
    ID  int PRIMARY KEY, 
    name varchar2(50) NOT NULL, 
    CONSTRAINT fk_length 
    FOREIGN KEY (id_length) 
    REFERENCES length(ID) 
    ON DELETE CASCADE 
); 

CREATE TABLE length (
    ID  int PRIMARY KEY, 
    length int NOT NULL 
); 
0

Извините, я не могу воспроизвести это, используя таблицы, которые вы указали в своем вопросе. Вот сессии в SQL * Plus:

SQL> CREATE TABLE movie (
    2  ID  int PRIMARY KEY, 
    3  name varchar2(50) NOT NULL 
    4 ); 

Table created. 

SQL> CREATE TABLE length (
    2  ID  int PRIMARY KEY REFERENCES movie(ID) ON DELETE CASCADE, 
    3  length int NOT NULL 
    4 ); 

Table created. 

SQL> insert into movie (id, name) values (1, 'Test'); 

1 row created. 

SQL> commit; 

Commit complete. 

SQL> insert into length (id, length) values (1, 2); 

1 row created. 

SQL> commit; 

Commit complete. 

SQL> delete from movie where id=1; 

1 row deleted. 

SQL> select * from length; 

no rows selected 

Я подозреваю, что ограничение внешнего ключа на вашем столе length не имеет положения ON DELETE CASCADE вы думаете, что он делает. Возможно, вы создали эту таблицу ранее без этого предложения, и когда вы попытались снова создать эту таблицу с помощью ON DELETE CASCADE, вы не заметили, что SQL Developer не смог создать таблицу? (Создание таблицы второй раз завершится неудачей, потому что таблица уже существует.)

Попробуйте опустить таблицу length и создать ее снова.

Смежные вопросы