免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7880 | 回复: 6

在MySQL中利用外键实现级联删除! [复制链接]

论坛徽章:
0
发表于 2004-12-08 22:06 |显示全部楼层
以下为原创,转载请注明出处!

作者:Dirk (dirk.ye AT gmail.com)
Url:http://dirk.pdx.cn
日期:2004/12/08



首先,目前在产品环境可用的MySQL版本(指4.0.x和4.1.x)中,只有InnoDB引擎才允许使用外键,所以,我们的数据表必须使用InnoDB引擎。

下面,我们先创建以下测试用数据库表:


  1. CREATE TABLE `roottb` (
  2.   `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,
  3.   `data` VARCHAR(100) NOT NULL DEFAULT '',
  4.   PRIMARY KEY (`id`)
  5. ) TYPE=InnoDB;

  6. CREATE TABLE `subtb` (
  7.   `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,
  8.   `rootid` INT(11) UNSIGNED NOT NULL DEFAULT '0',
  9.   `data` VARCHAR(100) NOT NULL DEFAULT '',
  10.   PRIMARY KEY (`id`),
  11.   INDEX (`rootid`),
  12.   FOREIGN KEY (`rootid`) REFERENCES roottb(`id`) ON DELETE CASCADE
  13. ) TYPE=InnoDB;
复制代码


注意:
1、必须使用InnoDB引擎;
2、外键必须建立索引(INDEX);
3、外键绑定关系这里使用了“ ON DELETE CASCADE”,意思是如果外键对应数据被删除,将关联数据完全删除,更多信息请参考MySQL手册中关于InnoDB的文档;

好,接着我们再来插入测试数据:


  1. INSERT INTO `roottb` (`id`,`data`)
  2.   VALUES ('1', 'test root line 1'),
  3.          ('2', 'test root line 2'),
  4.          ('3', 'test root line 3');

  5. INSERT INTO `subtb` (`id`,`rootid`,`data`)
  6.   VALUES ('1', '1', 'test sub line 1 for root 1'),
  7.          ('2', '1', 'test sub line 2 for root 1'),
  8.          ('3', '1', 'test sub line 3 for root 1'),
  9.          ('4', '2', 'test sub line 1 for root 2'),
  10.          ('5', '2', 'test sub line 2 for root 2'),
  11.          ('6', '2', 'test sub line 3 for root 2'),
  12.          ('7', '3', 'test sub line 1 for root 3'),
  13.          ('8', '3', 'test sub line 2 for root 3'),
  14.          ('9', '3', 'test sub line 3 for root 3');
复制代码


我们先看一下当前数据表的状态:


  1. mysql>; show tables;
  2. +----------------+
  3. | Tables_in_test |
  4. +----------------+
  5. | roottb         |
  6. | subtb          |
  7. +----------------+
  8. 2 rows in set (0.00 sec)

  9. mysql>; select * from `roottb`;
  10. +----+------------------+
  11. | id | data             |
  12. +----+------------------+
  13. |  1 | test root line 1 |
  14. |  2 | test root line 2 |
  15. |  3 | test root line 3 |
  16. +----+------------------+
  17. 3 rows in set (0.05 sec)

  18. mysql>; select * from `subtb`;
  19. +----+--------+----------------------------+
  20. | id | rootid | data                       |
  21. +----+--------+----------------------------+
  22. |  1 |      1 | test sub line 1 for root 1 |
  23. |  2 |      1 | test sub line 2 for root 1 |
  24. |  3 |      1 | test sub line 3 for root 1 |
  25. |  4 |      2 | test sub line 1 for root 2 |
  26. |  5 |      2 | test sub line 2 for root 2 |
  27. |  6 |      2 | test sub line 3 for root 2 |
  28. |  7 |      3 | test sub line 1 for root 3 |
  29. |  8 |      3 | test sub line 2 for root 3 |
  30. |  9 |      3 | test sub line 3 for root 3 |
  31. +----+--------+----------------------------+
  32. 9 rows in set (0.01 sec)
复制代码


嗯,一切都正常,好,下面我们要试验我们的级联删除功能了。

我们将只删除roottb表中id为2的数据记录,看看subtb表中rootid为2的相关子纪录是否会自动删除:


  1. mysql>; delete from `roottb` where `id`='2';
  2. Query OK, 1 row affected (0.03 sec)

  3. mysql>; select * from `roottb`;
  4. +----+------------------+
  5. | id | data             |
  6. +----+------------------+
  7. |  1 | test root line 1 |
  8. |  3 | test root line 3 |
  9. +----+------------------+
  10. 2 rows in set (0.00 sec)

  11. mysql>; select * from `subtb`;
  12. +----+--------+----------------------------+
  13. | id | rootid | data                       |
  14. +----+--------+----------------------------+
  15. |  1 |      1 | test sub line 1 for root 1 |
  16. |  2 |      1 | test sub line 2 for root 1 |
  17. |  3 |      1 | test sub line 3 for root 1 |
  18. |  7 |      3 | test sub line 1 for root 3 |
  19. |  8 |      3 | test sub line 2 for root 3 |
  20. |  9 |      3 | test sub line 3 for root 3 |
  21. +----+--------+----------------------------+
  22. 6 rows in set (0.01 sec)
复制代码


嗯,看subtb表中对应数据确实自动删除了,测试成功。

结论:在MySQL中利用外键实现级联删除成功!

论坛徽章:
0
发表于 2005-12-16 13:15 |显示全部楼层
好  谢谢Yerk 的奉献

论坛徽章:
0
发表于 2005-12-16 18:39 |显示全部楼层
顶一下,支持原创!

论坛徽章:
0
发表于 2005-12-19 09:16 |显示全部楼层
嗯,谢谢,不过用到的时候,还是得自己试一下才放心,呵呵

论坛徽章:
0
发表于 2005-12-19 09:33 |显示全部楼层
如果建的时候不是用的InnoDB,那怎么修改一下?

论坛徽章:
0
发表于 2005-12-19 17:32 |显示全部楼层
我也顶一下,支持原创! 且挺有深度!!

论坛徽章:
0
发表于 2009-03-20 21:47 |显示全部楼层

学习了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP