Mysql中实现级联删除

原文出处:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=462977

转载请标明原文出处!

mysql中实现级联删除

首先,目前在产品环境可用的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中利用外键实现级联删除成功!





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

结论:在MySQL中利用外键实现级联删除成功!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值