Welcome 微信登录

首页 / 数据库 / MySQL / 在MySQL中利用外键实现级联删除

首先,目前在产品环境可用的MySQL版本(指4.0.x和4.1.x)中,只有InnoDB引擎才允许使用外键,所以,我们的数据表必须使用InnoDB引擎。 下面,我们先创建以下测试用数据库表: CREATE TABLE `roottb` (
  `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,
  `data` VARCHAR(100) NOT NULL DEFAULT "",
  PRIMARY KEY (`id`)
) TYPE=InnoDB;CREATE TABLE `subtb` (
  `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,
  `rootid` INT(11) UNSIGNED NOT NULL DEFAULT "0",
  `data` VARCHAR(100) NOT NULL DEFAULT "",
  PRIMARY KEY (`id`),
  INDEX (`rootid`),
  FOREIGN KEY (`rootid`) REFERENCES roottb(`id`) ON DELETE CASCADE
) TYPE=InnoDB;注意:
1、必须使用InnoDB引擎;
2、外键必须建立索引(INDEX);
3、外键绑定关系这里使用了“ ON DELETE CASCADE”,意思是如果外键对应数据被删除,将关联数据完全删除,更多信息请参考MySQL手册中关于InnoDB的文档; 好,接着我们再来插入测试数据: INSERT INTO `roottb` (`id`,`data`)
  VALUES ("1", "test root line 1"),
         ("2", "test root line 2"),
         ("3", "test root line 3");INSERT INTO `subtb` (`id`,`rootid`,`data`)
  VALUES ("1", "1", "test sub line 1 for root 1"),
         ("2", "1", "test sub line 2 for root 1"),
         ("3", "1", "test sub line 3 for root 1"),
         ("4", "2", "test sub line 1 for root 2"),
         ("5", "2", "test sub line 2 for root 2"),
         ("6", "2", "test sub line 3 for root 2"),
         ("7", "3", "test sub line 1 for root 3"),
         ("8", "3", "test sub line 2 for root 3"),
         ("9", "3", "test sub line 3 for root 3");我们先看一下当前数据表的状态: mysql>; show tables;
+----------------+
| Tables_in_test |
+----------------+
| roottb         |
| subtb          |
+----------------+
2 rows in set (0.00 sec)mysql>; select * from `roottb`;
+----+------------------+
| id | data             |
+----+------------------+
|  1 | test root line 1 |
|  2 | test root line 2 |
|  3 | test root line 3 |
+----+------------------+
3 rows in set (0.05 sec)mysql>; select * from `subtb`;
+----+--------+----------------------------+
| id | rootid | data                       |
+----+--------+----------------------------+
|  1 |      1 | test sub line 1 for root 1 |
|  2 |      1 | test sub line 2 for root 1 |
|  3 |      1 | test sub line 3 for root 1 |
|  4 |      2 | test sub line 1 for root 2 |
|  5 |      2 | test sub line 2 for root 2 |
|  6 |      2 | test sub line 3 for root 2 |
|  7 |      3 | test sub line 1 for root 3 |
|  8 |      3 | test sub line 2 for root 3 |
|  9 |      3 | test sub line 3 for root 3 |
+----+--------+----------------------------+
9 rows in set (0.01 sec)嗯,一切都正常,好,下面我们要试验我们的级联删除功能了。 我们将只删除roottb表中id为2的数据记录,看看subtb表中rootid为2的相关子纪录是否会自动删除:
mysql>; delete from `roottb` where `id`="2";
Query OK, 1 row affected (0.03 sec)mysql>; select * from `roottb`;
+----+------------------+
| id | data             |
+----+------------------+
|  1 | test root line 1 |
|  3 | test root line 3 |
+----+------------------+
2 rows in set (0.00 sec)mysql>; select * from `subtb`;
+----+--------+----------------------------+
| id | rootid | data                       |
+----+--------+----------------------------+
|  1 |      1 | test sub line 1 for root 1 |
|  2 |      1 | test sub line 2 for root 1 |
|  3 |      1 | test sub line 3 for root 1 |
|  7 |      3 | test sub line 1 for root 3 |
|  8 |      3 | test sub line 2 for root 3 |
|  9 |      3 | test sub line 3 for root 3 |
+----+--------+----------------------------+
6 rows in set (0.01 sec)嗯,看subtb表中对应数据确实自动删除了,测试成功。 结论:在MySQL中利用外键实现级联删除成功!DB2数据备份和恢复MySQL 查询随机条记录的sql语句和php计算概率相关资讯      MySQL数据库教程 
  • MySQL 处理非法数据  (04/09/2013 08:06:28)
  • MySQL关于timestamp和mysqldump的  (12/16/2012 13:25:41)
  • MySQL保证数据完整性  (12/16/2012 12:00:35)
  • ERROR 1130: mysql 1130连接错误的  (12/16/2012 13:29:08)
  • MySQL数据库教程:管理数据库和表(  (12/16/2012 12:47:02)
  • MySQL快速插入大批量数据存储过程  (11/05/2012 19:04:04)
本文评论 查看全部评论 (0)
表情: 姓名: 字数