2016-11-22 43 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表并重新创建它。