SQL约束删除不会删除子,但会出错

时间:2016-11-22 21:46:55

标签: sql oracle sql-delete

2表:

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?

2 个答案:

答案 0 :(得分: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
);

答案 1 :(得分: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表并再次创建。