2012-07-29 95 views
3

我想从8个表中删除特定的行。 我的问题是行与外键连接。 如何删除连接到要删除的特定行的所有数据? 我的表格包括定义表(如id,名称,最大值,最小值...), 数据表(如id,user_id,definition_id,....)和历史表(保存数据表中的每一项更改)。如何删除表中的行sql

我以为使用级联命令删除,但我找不到使用它的方法。

+0

你用什么SQL:MySQL和MSSQL等..? – Michael 2012-07-29 12:12:50

+1

您可以使用8个删除语句(每个表对应一个)按照正确的顺序执行,以便不违反FK约束。 – 2012-07-29 12:12:55

+0

@Michael我使用MySql – Ofer 2012-07-29 12:14:43

回答

4

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是否可以。

0

我假设你使用InnoDB引擎,因为你所谈论的外键,

更容易将是正确定义的表,这样的删除将作为级联删除行为。

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

这里是ALINK用适当的创建表的语句:

How do I use on delete cascade in mysql?