之前的数据库操作都是比较简单的单一增删改查,今天遇到多表通过外键联合,如果主表数据删除,其他从表的数据也必须删除,表结构大致如下
book表字段 | print表字段 | print_binding表字段 | print_binding_year表字段 |
---|---|---|---|
guid | guid | guid | guid |
…. | book_guid | print_guid | bind_guid |
… | … | … | … |
也就是说,如果我删除了book的一条记录,其他三个表与之关联的表都需要同时删除
例如,我要删除的book的guid为?
DELETE b,p,pb,pby FROM book b INNER JOIN print p ON b.guid = p.book_guid INNER JOIN print_binding pb ON p.guid = pb.print_guid INNER JOIN print_binding_year pby ON pb.guid=pby.bind_guid WHERE b.guid = ?
但是这样处理会导致一个问题,如果book中有需要删除的数据,而其他三张表中没有与其关联的数据,那么就不会有任何数据被删除,因为满足相等连接条件没有得到满足(因为其他三张表没有对应的内容啊,怎么可能会满足!)
具体理论可以参考内连接与外连接小结
如果book表一定有数据,而关联的表有可能有数据也有可能没数据的话,我们可以通过左连接删除的方式,把两张表都删除。无论关联的表有没有数据,book表都可以删除成功
DELETE b,p,pb,pby FROM book b LEFT OUTER JOIN print p ON b.guid = p.book_guid LEFT OUTER JOIN print_binding pb ON p.guid = pb.print_guid LEFT OUTER JOIN print_binding_year pby ON pb.guid=pby.bind_guid WHERE b.guid = ?
原理参见内连接与外连接小结