今天做了实验,要求将满足某个条件的主表和相关联的几个子表的数据全部删除,其实这个要求很简单,如果子表在创建外键的时候指定了ON DELETE CASCADE,则直接从主表中删除相关记录,子表中数据也会一起删除。但是现在的子表外键创建时候没有加此语句,如何来实现呢? 条件:p(父表)没有ON DELETE CASCADE c(子表) mysql> delete a,b from p a,c b where a.id=b.id; ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`hhl`.`c`, CONSTRAINT `FK_P_ID` FOREIGN KEY (`id`) REFERENCES `p` (`id`)) mysql> show profiles ; +----------+------------+------------------------------------------+ | Query_ID | Duration | Query | +----------+------------+------------------------------------------+ | 1 | 0.00875600 | delete a,b from p a,c b where a.id=b.id | | 2 | 0.01294200 | delete a,b from p a,c b where a.id=b.id | +----------+------------+------------------------------------------+ mysql> show profile for query 2 ;
+--------------------------+----------+ | Status | Duration | +--------------------------+----------+ | starting | 0.000314 | | checking permissions | 0.000026 | | checking permissions | 0.000014 | | checking permissions | 0.000009 | | checking permissions | 0.000010 | | init | 0.000033 | | Opening tables | 0.000082 | | System lock | 0.000047 | | init | 0.000050 | | deleting from main table | 0.000016 | | optimizing | 0.000019 | | statistics | 0.000056 | | preparing | 0.000042 | | executing | 0.000054 | | Sending data | 0.005026 | | end | 0.000050 | | query end | 0.003456 | | closing tables | 0.000143 | | freeing items | 0.003430 | | logging slow query | 0.000047 | | cleaning up | 0.000021 | +--------------------------+----------+ 21 rows in set (0.00 sec) 看出上面没有删除子表的操作。 mysql> delete a,b from c a,p b where a.id=b.id; Query OK, 6 rows affected (0.04 sec) from 后面 子表在前,删除成功!! mysql> show profile for query 3 ;
+--------------------------------+----------+ | Status | Duration | +--------------------------------+----------+ | starting | 0.000307 | | checking permissions | 0.000019 | | checking permissions | 0.000017 | | checking permissions | 0.000009 | | checking permissions | 0.000010 | | init | 0.000021 | | Opening tables | 0.000091 | | System lock | 0.000036 | | init | 0.000047 | | deleting from main table | 0.000016 | | optimizing | 0.000125 | | statistics | 0.000084 | | preparing | 0.000042 | | executing | 0.000013 | | Sending data | 0.000572 | | deleting from reference tables | 0.000103 | | end | 0.000015 | | Waiting for query cache lock | 0.000009 | | end | 0.000010 | | Waiting for query cache lock | 0.000008 | | end | 0.000160 | | end | 0.000022 | | query end | 0.030033 | | closing tables | 0.000081 | | freeing items | 0.001465 | | logging slow query | 0.000052 | | cleaning up | 0.000011 | +--------------------------------+----------+ 27 rows in set (0.00 sec) 另一种方式: 先删除最外层的子表,一层一层向里删除,最后删除父表。
|