【问题标题】:How to delete data from parent table in mysql5?如何从mysql5中的父表中删除数据?
【发布时间】:2011-11-04 07:27:55
【问题描述】:

您好,我正在使用 mysql5 innoDB 数据库。我想从父行及其相关子表数据中强制删除数据。我怎样才能做到这一点。任何人都可以帮助我。

【问题讨论】:

    标签: mysql sql cascading-deletes mysql5


    【解决方案1】:

    如果您使用 innodb,则可以在删除父行时使用 FOREIGN KEY CONSTRAINTS 进行级联删除,子行也将被删除。

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

    另一种方法是在删除中使用多表语法。 看http://dev.mysql.com/doc/refman/5.1/en/delete.html

    最后的方法是在删除操作后使用触发器。 看http://dev.mysql.com/doc/refman/5.1/en/trigger-syntax.html

    您也可以使用顺序删除语句,但在这种情况下您应该使用事务。注意:这个只适用于 innodb 表。

    【讨论】:

      【解决方案2】:

      连续两次删除就可以了:

      delete from ChildTable where ParentID = ?
      delete from ParentTable where ID = ?
      

      【讨论】:

      • 这是所有不支持foreign keys的表引擎的方法
      • 如果表引擎不支持外键,我会使用触发器,这样我就不用考虑了。
      【解决方案3】:

      如果您使用外键约束,那么您可以在创建子表时使用 on delete cascade 子句从父表中删除一行,然后从子表中删除相应的主键行表也​​。

      如果您只想从父表中删除行而不是从子表中删除相应的主键行,则在创建子表时使用 on delete cascade null 子句。

      例如:创建一个名为“student”的父表和一个名为“library”的子表

      create table student(sno integer(5) primary key,sname varchar(20));
      
      insert into student values(1,"suman");
      insert into student values(2,"sai"); 
      insert into student values(3,"saaaa");
      
      create table library(sno integer(5) references primary key(sno) on delete cascade,book_name varchar(20));
      
      insert into student values(1,"c");
      insert into student values(2,"JAVA");
      insert into student values(3,"ORACLE");
      

      现在从父表中删除第二行

      delete from student where sno=2;
      

      然后它将从子表中删除相应的行(2 JAVA)。因为您只使用“on delete cascade”子句。

      假设如果您使用 on delete cascade null 那么它将仅从父表中删除行 (2 Sai)。

      :) :):) :):) :):) :):) :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-30
        • 1970-01-01
        • 2015-08-23
        • 1970-01-01
        • 1970-01-01
        • 2019-03-04
        • 2012-10-17
        • 2021-06-14
        相关资源
        最近更新 更多