SQL删除与Cascade

时间:2012-12-18 14:23:13

标签: mysql sql sql-delete cascading-deletes multi-table-delete

我正在创建一个联系人管理系统,记录公司的联系方式,联系人,活动,公司提交的提案以及捐赠。

一家公司可以拥有多个联系人,可以在多个广告系列中提交许多提案,并可以为许多广告系列捐款。公司不需要联系人,提交任何提案并进行任何捐赠。我已成功使用INSERT,UPDATE和SELECT但不是DELETE进行查询。现在我正在使用此查询删除公司及其所有相关数据:

DELETE organizations.*, contactdetails.*, proposalorg.*, donationorg.*
FROM organizations, contactdetails, proposalorg, donationorg 
WHERE idOrg='$id' AND  
contactdetails.company_id=organizations.idOrg AND 
proposalorg.company_id=organizations.idOrg AND 
donationorg.company_id=organizations.idOrg

我知道如果此查询有任何错误,它将不会删除该公司。我已经阅读了关于DELETE CASCADE作为更好的选择,但我不知道该怎么做。如果有人知道如何做到这一点,我会非常感激。

2 个答案:

答案 0 :(得分:2)

要使用级联删除,您需要在表之间使用外键约束。您可以在定义外键时设置级联删除规则,如下所示:

ALTER TABLE contactdetails ADD
CONSTRAINT FK_contactdetails_company_id FOREIGN KEY (company_id) 
REFERENCES organizations (idOrg)
ON DELETE CASCADE

这会告诉db,当从organization表中删除一行时,如果contactdetails中有任何引用它的行,那么也应该删除它们。

至于这是否是一个好主意 - 这是一个意见问题。就个人而言,我不喜欢使用它们,因为它太容易意外删除许多你可能不打算删除的数据。但是其他人不同意我确定。

答案 1 :(得分:0)

您使用“on delete cascade”和外键约束。外键约束通常放在外部ID上,这些是用于连接多个表的ID。

当您将外键约束与cascade一起使用时,只能从主表中删除而不使用表连接,如示例中所示。

您能否显示表结构定义的重要部分?

请参阅http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html