如何从表sql中删除行

时间:2012-07-29 12:10:01

标签: mysql sql oracle-sqldeveloper

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

我想在cascade命令上使用delete但我找不到使用它的方法。

2 个答案:

答案 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语句:

How do I use on delete cascade in mysql?