[分享]MySQL主外键表关联表数据的同时删除_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3628 | 回复: 0   主题: [分享]MySQL主外键表关联表数据的同时删除        下一篇 
napolenAx
注册用户
等级:少校
经验:802
发帖:118
精华:1
注册:2011-8-30
状态:离线
发送短消息息给napolenAx 加好友    发送短消息息给napolenAx 发消息
发表于: IP:您无权察看 2014-12-10 11:49:16 | [全部帖] [楼主帖] 楼主

     今天做了实验,要求将满足某个条件的主表和相关联的几个子表的数据全部删除,其实这个要求很简单,如果子表在创建外键的时候指定了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)


另一种方式: 先删除最外层的子表,一层一层向里删除,最后删除父表。

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论