我想删除8个表中的特定行。 我的问题是行与外键连接。 如何删除连接到我要删除的特定行的所有数据? 我的表包括定义表(如id,name,max value,min value ...), 数据表(如id,user_id,definition_id,....)和历史表(保存数据表中的每个更改)。
我想在cascade命令上使用delete但我找不到使用它的方法。
答案 0 :(得分:5)
DELETE CASCADE
是外键约束的一个属性。不幸的是,这不是一个可以用DELETE
语句作为选项的东西(实际上真的很酷)
如果您的外键未被声明为级联,则需要“按照自己的方式工作”。
不幸的是,你没有向我们展示你真正的桌面结构,所以让我们假设这样的事情:
main_table (main_id) child_one (id, main_id) child_two (id, id_one) child_three (id, id_two)
(我知道你说了8张桌子,但是为了演示我缩短了一点,但这并没有改变底层的“策略”)
假设您要从`main_table:
删除main_id = 42
的行
首先需要使用以下内容删除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是否可以。
答案 1 :(得分:0)
我假设你使用InnoDB引擎,因为你在谈论外键,
更容易正确定义表格,以便删除将作为级联删除。
CONSTRAINT `myForeignKey` FOREIGN KEY (`typeId`)
REFERENCES `types` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
这是一个正确的create table语句: