如何删除表中的行sql
问题描述:
我想从8个表中删除特定的行。 我的问题是行与外键连接。 如何删除连接到要删除的特定行的所有数据? 我的表格包括定义表(如id,名称,最大值,最小值...), 数据表(如id,user_id,definition_id,....)和历史表(保存数据表中的每一项更改)。如何删除表中的行sql
我以为使用级联命令删除,但我找不到使用它的方法。
答
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是否可以。
答
我假设你使用InnoDB引擎,因为你所谈论的外键,
更容易将是正确定义的表,这样的删除将作为级联删除行为。
CONSTRAINT `myForeignKey` FOREIGN KEY (`typeId`)
REFERENCES `types` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
这里是ALINK用适当的创建表的语句:
你用什么SQL:MySQL和MSSQL等..? – Michael 2012-07-29 12:12:50
您可以使用8个删除语句(每个表对应一个)按照正确的顺序执行,以便不违反FK约束。 – 2012-07-29 12:12:55
@Michael我使用MySql – Ofer 2012-07-29 12:14:43