【问题标题】:SQL Delete vs. CascadeSQL 删除与级联
【发布时间】:2012-12-18 14:23:13
【问题描述】:

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

一家公司可以有多个联系人,可以在多个活动中提交多个提案,并且可以为多个活动捐款。公司不需要有联系人,不需要提交任何提案,也不需要提供任何捐赠。我已成功使用 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 作为更好的选择,但我不知道该怎么做。如果有人对如何做到这一点有任何想法,我将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

    这将告诉数据库,当从组织表中删除一行时,如果contactdetails 中有任何行引用它,那么这些行也应该被删除。

    至于这是否是一个好主意 - 这是一个见仁见智的问题。就个人而言,我不喜欢使用它们,因为它很容易意外删除大量您可能不打算删除的数据。但我敢肯定,其他人会不同意。

    【讨论】:

    • 谢谢,@Eric Petreolje!谢谢你的建议。下次我将了解更多关于其他 DELETE 查询的信息,但这次我将使用 DELETE CASCADE。由于系统具有“导出到excel”功能,我认为删除数据应该不是一个大问题。再次感谢!
    【解决方案2】:

    您将“on delete cascade”与外键约束一起使用。外键约束通常放在外部 id 上,这些是您用来连接多个表的 id。

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

    你能展示你的表结构定义的重要部分吗?

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

    【讨论】:

    • 是的@Adder,我正在使用DELETE CASCADE,我刚刚尝试过它并且有效!感谢您花时间为我服务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多