2016-11-22 2 views
0

2テーブル:が、エラーを与える

delete from movie where ID=1; 

が、エラーを取得:

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 
); 

は、だから私は両方によってから値を削除しようとしました

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

なぜ私はON DELETE CASCADEを使用しますか?

+1

実際にどのDBMSを使用していますか? varchar2は有効なSQL Serverデータ型ではありません。これはオラクルですか? –

+0

申し訳ありませんが、これはOracle(SQL Developer) – Linz

+0

です。「CASCADE」オプションは反対方向に機能します。長さから削除すると、子テーブルの参照行が削除されます。関係定義を確認してください。 – Alfabravo

答えて

1

私はあなたの関係に誤りがあると思います。それは "1対多数"関係のようであり、FKは映画が多くの長さを有することを意味するlenghtテーブルにある。それはあなたが意味するものなのでしょうか?

通常、テーブルmovieの属性としてlengthを配置できます。しかし、この属性を分離したテーブルとして保持したい場合は、テーブルムービーにテーブルlengthを参照するFKを作成することをお勧めします。

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が表の作成に失敗したことに気付かなかったでしょうか?テーブルがすでに存在していたため、2回目のテーブルの作成は失敗します。

lengthテーブルを削除してもう一度作成してみます。

関連する問題