我想从 8 个表中删除特定行。我的问题是行与外键连接。如何删除连接到我要删除的特定行的所有数据?我的表包括定义表(如 id、name、max value、min value...)、数据表(如 id、user_id、definition_id、....)和历史表(保存数据表中的每个更改)。
我想在级联命令上使用删除,但我找不到使用它的方法。
我想从 8 个表中删除特定行。我的问题是行与外键连接。如何删除连接到我要删除的特定行的所有数据?我的表包括定义表(如 id、name、max value、min value...)、数据表(如 id、user_id、definition_id、....)和历史表(保存数据表中的每个更改)。
我想在级联命令上使用删除,但我找不到使用它的方法。
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 是否可以。
我假设您使用 InnoDB Engine,因为您在谈论外键,
更容易正确定义表,以便删除将作为级联删除。
CONSTRAINT `myForeignKey` FOREIGN KEY (`typeId`)
REFERENCES `types` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
这是一个正确的创建表语句的链接: