首先,目前在产品环境可用的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中利用外键实现级联删除成功!
---------------------------------------------------------------------------------------------------------------
user表: 
create table user 
( 
userid integer not null auto_increment primary key, 
username varchar(12) not null 
) 
type=innodb;

password表: 
create table password 
( 
userid integer not null, 
password varchar(12) not null, 
index (userid), 
foreign key (userid) references user (userid) 
on delete cascade 
on update cascade 
) 
type=innodb;

1、MySQL支持外键约束,并提供与其它DB相同的功能,但表类型必须为 InnoDB 
2、建外键的表的那个列要加上index.

mysql级联删除更新的更多相关文章

  1. MySQL级联删除的问题

    一.FOREIGN KEY 的定义分为两种:列级约束和表级约束 .列及约束的话,可以在列定义的同时,定义外键约束.比如 如果有2张表,主表:T1(A1 )) 要在从表T2中定义外键列这可以: Crea ...

  2. mysql级联删除

    一个building对应多个rooms,building删除----级联删除相关的rooms 第一步, 创建buildings表,如下创建语句: USE testdb; CREATE TABLE bu ...

  3. MySQL级联删除和级联修改

    1.新建主键table create table demo1_zhujian ( id int primary key auto_increment, name )); 2.新建外键table cre ...

  4. [原创]MYSQL中利用外键实现级联删除和更新

    MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定 ...

  5. MySQL中利用外键实现级联删除、更新

    MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作 ...

  6. Mysql实现级联操作(级联更新、级联删除)

    一.首先创建两张表stu,sc create table stu( sid int UNSIGNED primary key auto_increment, name ) not null) TYPE ...

  7. MySQL之级联删除、级联更新、级联置空

    1. 准备测试表 # 专业表major ))engine=innodb default charset=utf8; # 学生表mstudent ), major int)engine=innodb d ...

  8. Mysql实现级联操作(级联更新、级联删除)(转)

    一.首先创建两张表stu,sc create table stu( sid int UNSIGNED primary key auto_increment, name varchar(20) not ...

  9. mysql级联更新的两种方式:触发器更新和外键

    1.mysql级联更新有两种方式:触发器更新和外键更新. 2.触发器更新和外键更新的目的都是为了保证数据完整性. 我们通常有这样的需求:删除表Table 1中记录,需要同时删除其它表中与Table 1 ...

随机推荐

  1. 初测WIN10

    WIN10已经发布,通过百度直通车把WIN7升级成了WIN10,改变较大,不太习惯,用着不是很顺手. 吐槽几个问题 1.微软的Visual Studio 2015 Community版本,宣布是免费的 ...

  2. IIS目录下文件共享后System.IO.File.Exists返回false

    场景:在iis目录下,因为特殊需要共享一个文件夹,给到其他的技术人员访问,突然发现小小的操作,搞“大”了,使用 string path = Server.MapPath("~/file/te ...

  3. [Android教程]TextView使用SpannableString设置复合文本

    TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式.事件方面的设置.Android系统通过SpannableString类来对指定文本进行相关处理,具体有以下功能: 1.Bac ...

  4. php session偶尔写入失败的原因

    session_start(); var_dump($_SESSION); $key = sprintf('%05d', mt_rand(0, 99999)); $key = strval($key) ...

  5. Winfrom 抓取web页面内容代码

    WebRequest request = WebRequest.Create("http://1.bjapp.sinaapp.com/play.php?a=" + PageUrl) ...

  6. MySQL主从修复

    MySQL主从故障修复 测试库:192.168.1.2 主192.168.1.3 从 192.168.1.4 主 4又是2的从库192.168.1.5 从 有人修改了192.168.1.2和192.1 ...

  7. Oracle 学习路径

    学习路线图: 学习的方法和思路: 有了google为什么还需要学习? 有了官方文档还需要学习了吗? 工作角色: 开发人员:SQL操作数据库,PL/SQL实现逻辑结构.企业需要最多.对逻辑思维要求比较高 ...

  8. 快书包CEO徐智明反思:我犯下哪些错误

    新浪科技 刘璨 1月23日,快书包CEO徐智明在微博上公开“叫卖”快书包,在业内引起不小反响.这家创立于2010年要做“网上711”的创业公司,曾以独特的“一小时送达”服务在业内成为关注焦点. “如果 ...

  9. mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别

    <?php $link=mysql_connect('localhost','root',”); mysql_select_db('abc',$link); $sql = “select * f ...

  10. DB天气app冲刺二阶段第五天

    昨天什么事情也没做..看了一场哆啦a梦 所以就不算冲刺了.. 今天主要就是做了一下需要用到的图片的整理还有的就是UI主界面需要展示用的素材,发现好多东西都需要搜索半天,虽然这个不是什么技术活..但真的 ...