2012-12-18 39 views
3

我正在创建一个联系人管理系统,用于记录公司的联系人详细信息,联系人,活动,公司提交的提案以及捐款。SQL删除与级联

一家公司可以有许多联系人,可以在许多广告系列中提交很多提案,并且可以为多个广告系列捐款。公司不需要有联系人,提交任何建议并提供任何捐赠。我已经成功地使用INSERT,UPDATE和SELECT进行查询,但没有删除。现在,我使用这个查询来删除公司及其所有相关数据:

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

使用级联删除,你需要有表之间的外键约束。

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

这将告诉分贝,当行从组织表中删除,如果在contactdetails引用它的任何行:定义外键的时候,像这样你就建立了级联删除规则,那些也应该删除。

至于这是不是一个好主意 - 这是一个意见问题。就我个人而言,我不喜欢使用它们,因为它太容易意外删除可能不想删除的大量数据。但其他人会不同意我相信。

+0

谢谢,@Eric Petreolje!谢谢你的建议。我将在下一次了解更多关于其他DELETE查询的知识,但是这次我将使用DELETE CASCADE。由于系统具有“导出为ex​​cel”功能,我不认为这应该是一个关于删除数据的大问题。再次感谢! – mella

0

您使用“删除级联”和外键约束。外键约束通常放置在外部标识符上,这些标识符用于连接多个表。

将外键约束与级联一起使用时,只能从主表中删除,不要使用表连接,就像在示例中一样。

您可以显示表结构定义的重要部分吗?

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

+0

是的@Adder,我正在使用DELETE CASCADE,我刚刚尝试过它,它的工作原理!谢谢你花时间陪伴我。 – mella