3

我想从 8 个表中删除特定行。我的问题是行与外键连接。如何删除连接到我要删除的特定行的所有数据?我的表包括定义表(如 id、name、max value、min value...)、数据表(如 id、user_id、definition_id、....)和历史表(保存数据表中的每个更改)。

我想在级联命令上使用删除,但我找不到使用它的方法。

4

2 回答 2

5

DELETE CASCADE是外键约束的一个属性。不幸的是,您不能将其用作DELETE声明的选项(实际上真的很酷)

如果您的外键未声明为级联,则需要“向上工作”。

不幸的是,您没有向我们展示您的真实表结构,所以让我们假设如下:

主表(主 ID)
   child_one (id, main_id)
     child_two (id, id_one)
       child_three (id, id_two)

(我知道你说的是 8 张桌子,但为了演示,我把它缩短了一点,但这并没有改变潜在的“策略”)

假设您想main_id = 42从 `main_table 删除行:

您首先需要使用以下内容从 child_three 中删除行:

delete from child_three
where id_two in (select id 
                 from child_two 
                 where id_one in (select id
                                  from child_one 
                                  where main_id = 42);

然后从 child_two 中删除行:

delete from child_two
where id_one in (select id
                 from child_one 
                 where main_id = 42);

然后child_one:

delete from child_one
where main_id = 42;

最后是主表:

delete from main_table
where id = 42;

一些 SQL 客户端实际上可以为您生成这些语句。我不知道 SQL Developer 是否可以。

于 2012-07-29T12:20:12.647 回答
0

我假设您使用 InnoDB Engine,因为您在谈论外键,

更容易正确定义表,以便删除将作为级联删除。

     CONSTRAINT `myForeignKey` FOREIGN KEY (`typeId`)
        REFERENCES `types` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

这是一个正确的创建表语句的链接:

如何在 mysql 中使用删除级联?

于 2012-07-29T12:20:22.493 回答