2016-11-22 37 views
0

2表:SQL約束刪除不排除孩子,但給人一種錯誤

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

實際使用哪些DBMS? varchar2不是有效的sql server數據類型。這是Oracle嗎? –

+0

對不起,是的,這是Oracle(SQL Developer) – Linz

+0

'CASCADE'選項在另一個方向上工作。如果從長度刪除,它將刪除子表上的引用行。檢查關係定義。 – Alfabravo

回答

1

我認爲你的關係存在錯誤。這似乎是「一對多」的關係,FK在lenght表中,這意味着電影有很多長度。這是你的意思嗎?

通常,length可作爲表movie的屬性放置。但是如果你想保留這個屬性作爲一個單獨的表格,我建議你在表格電影中創建一個引用表格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 *會話加:

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表並重新創建它。