MySQL通过外键约束实现数据库的参照完整性,外键约束条件可在创建外键时指定,table的存储引擎只能是InnoDB,因为只有这种存储模式才支持外键。

外键约束条件有以下4种:

(1)restrict方式:同no action,都是立即检查外键约束;

- - 限制,指的是如果子表引用父表的某个字段的值,那么不允许直接删除父表的该值。

(2)cascade方式:在父表上update/delete记录时,同步update/delete子表的匹配记录 ;

On delete cascade从mysql3.23.50开始可用,on update cascade从mysql4.0.8开始可用 ;

-- 级联,删除/更新父表的某条记录,子表中引用该值的记录会自动被删除/更新。

(3)No action方式:如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作 这个是ANSI SQL-92标准,从mysql4.0.8开始支持;

--无参照完整性关系,有了也不生效。

(4)set null方式:在父表上update/delete记录时,将子表上匹配记录的列设为null 要注意子表的外键列不能为not null

On delete set null从mysql3.23.50开始可用;,on update set null从mysql4.0.8开始可用 。

首先创建一个用户表,并插入两条记录:

mysql>create table t_group-> (id intauto_increment primary key,-> name varchar(20))-> engine=InnoDB;

Query OK,0 rows affected (0.08sec)

mysql> insert into t_group values (1,'Group_1'),(2,'Group_2');

Query OK,2 rows affected (0.04sec)

Records:2 Duplicates: 0 Warnings: 0mysql> select * fromt_group;+----+---------+

| id | name |

+----+---------+

| 1 | Group_1 |

| 2 | Group_2 |

+----+---------+

2 rows in set (0.00 sec)

1.级联方式

创建级联子表:

mysql>create table t_user-> (id int not nullprimary key,-> name varchar(10),groupid int,->foreign key(groupid) references t_group(id)->on delete cascade on update cascade)-> engine=InnoDB;

Query OK,0 rows affected (0.08 sec)

完整性约束测试,以下例子都省略完整性测试:

mysql> insert into t_user values (1,'dayu',1),(2,'duoduo',2);

Query OK, 2 rows affected (0.08 sec)

Records: 2 Duplicates: 0 Warnings: 0

mysql> insert into t_user values (1,'huanhuan',1); //实体完整性测试,不能插入重复主键值

ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

mysql> insert into t_user values (3,'maiqi',3); //参照完整性测试,不能插入在主表中不存在的外键值

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`t_user`, CONSTRAINT `t_user_ibfk_1` FOREIGN KEY (`groupid`) REFERENCES `t_group` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)

级联测试:

mysql> select * from t_user;

+----+--------+---------+

| id | name | groupid |

+----+--------+---------+

| 1 | dayu | 1 |

| 2 | duoduo | 2 |

+----+--------+---------+

2 rows in set (0.00 sec)

mysql> update t_group set id=3 where id=2; //从主表中更新一个记录

Query OK, 1 row affected (0.02 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from t_user; /改变主表数据,从表数据随着更新

+----+--------+---------+

| id | name | groupid |

+----+--------+---------+

| 1 | dayu | 1 |

| 2 | duoduo | 3 |

+----+--------+---------+

2 rows in set (0.00 sec)

mysql> select * from t_user;

+----+--------+---------+

| id | name | groupid |

+----+--------+---------+

| 1 | dayu | 1 |

| 2 | duoduo | 3 |

+----+--------+---------+

2 rows in set (0.00 sec)

mysql> delete from t_group where id=3; //从主表中删除一个记录

Query OK, 1 row affected (0.03 sec)

mysql> select * from t_user; //子表中对应的记录自动被删除

+----+------+---------+

| id | name | groupid |

+----+------+---------+

| 1 | dayu | 1 |

+----+------+---------+

1 row in set (0.00 sec)

2.置空模式(set null,主表记录被删除,从表中对应的值设置为NULL)

首先创建一个子表:

mysql> select * from t_group;

+----+---------+

| id | name |

+----+---------+

| 1 | Group_1 |

| 2 | Group_2 |

+----+---------+

2 rows in set (0.00 sec)

mysql> create table t_user_1

-> (id int not null primary key,

-> name char(10),groupid int,

-> foreign key(groupid) references t_group(id)

-> on delete set null on update set null)

-> engine=InnoDB;

Query OK, 0 rows affected (0.11 sec)

mysql> insert into t_user_1 values (1,'dayu',1),(2,'duoduo',2),(3,'huanhuan',2),(4,'maiqi',1);

Query OK, 4 rows affected (0.02 sec)

Records: 4 Duplicates: 0 Warnings: 0

mysql> select * from t_user_1;

+----+----------+---------+

| id | name | groupid |

+----+----------+---------+

| 1 | dayu | 1 |

| 2 | duoduo | 2 |

| 3 | huanhuan | 2 |

| 4 | maiqi | 1 |

+----+----------+---------+

4 rows in set (0.00 sec)

mysql> update t_group set id=3 where id=1;

Query OK, 1 row affected (0.03 sec)

Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from t_user_1;

+----+----------+---------+

| id | name | groupid |

+----+----------+---------+

| 1 | dayu | NULL |

| 2 | duoduo | 2 |

| 3 | huanhuan | 2 |

| 4 | maiqi | NULL |

+----+----------+---------+

4 rows in set (0.00 sec)

mysql> delete from t_group where id=2; //从主表中删除一个记录

Query OK, 1 row affected (0.01 sec)

mysql> select * from t_user_1; //子表中对应的属性值被自动设置为NULL

+----+----------+---------+

| id | name | groupid |

+----+----------+---------+

| 1 | dayu | NULL |

| 2 | duoduo | NULL |

| 3 | huanhuan | NULL |

| 4 | maiqi | NULL |

+----+----------+---------+

4 rows in set (0.00 sec)

3.禁止模式(no action/restrict),如果在子表中有引用,则不允许在主表中进行更新或删除

首先创建一个子表:

mysql> select * from t_group;

+----+---------+

| id | name |

+----+---------+

| 1 | Group_1 |

| 2 | Group_2 |

+----+---------+

2 rows in set (0.00 sec)

mysql> create table t_user_2

-> (id int not null primary key,

-> name char(10),groupid int,

-> foreign key(groupid) references t_group(id)

-> on delete no action on update restrict)

-> engine=InnoDB;

Query OK, 0 rows affected (0.11 sec)

mysql> insert into t_user_2 values (1,'dayu',1),(2,'duoduo',2),(3,'huanhuan',2),(4,'maiqi',1);

Query OK, 4 rows affected (0.02 sec)

Records: 4 Duplicates: 0 Warnings: 0

mysql> select * from t_user_2;

+----+----------+---------+

| id | name | groupid |

+----+----------+---------+

| 1 | dayu | 1 |

| 2 | duoduo | 2 |

| 3 | huanhuan | 2 |

| 4 | maiqi | 1 |

+----+----------+---------+

4 rows in set (0.00 sec)

mysql> update t_group set id=3 where id=1;

ERROR1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t_user_2`, CONSTRAINT `t_user_2_ibfk_1` FOREIGN KEY (`groupid`) REFERENCES `t_group` (`id`) ON DELETE NO ACTION)

mysql> delete from t_group where id=2;

ERROR1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t_user_2`, CONSTRAINT `t_user_2_ibfk_1` FOREIGN KEY (`groupid`) REFERENCES `t_group` (`id`) ON DELETE NO ACTION)

4.主从表的删除

删除从表没有限制,如下:

mysql>drop table t_user_2;

Query OK,0 rows affected (0.01 sec)

如果存在引用的从表,则主要不能随意删除:

mysql>drop table t_group;

ERROR1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

经过以上测试,了解到MySQL通过外键约束实现了数据的完整性与一致性。

mysql on cascade_MySQL外键约束_ON DELETE CASCADE/ON UPDATE CASCADE相关推荐

  1. MySQL外键约束On Delete、On Update各取值的含义

    主键.外键和索引的区别?   主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 主索引(由关键字PRIMARY定义的索引) ...

  2. mysql on delete关键字_MySQL外键约束On Delete、On Update各取值的含义

    主键.外键和索引的区别? 主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键,外键可以有重复的,可以是空值 主索引(由关键字PRIMARY定义的索引),用于表 ...

  3. MySQL外键约束_ON DELETE CASCADE/ON UPDATE CASCADE

    MySQL通过外键约束实现数据库的参照完整性,外键约束条件可在创建外键时指定,table的存储引擎只能是InnoDB,因为只有这种存储模式才支持外键. 外键约束条件有以下4种: (1)restrict ...

  4. mysql外键约束脚本_如何在MySQL中设置外键约束

    (1) 外键的使用: 外键的作用,主要有两个: 一个是让数据库自己通过外键来保证数据的完整性和一致性 一个就是能够增加ER图的可读性 有些人认为外键的建立会给开发时操作数据库带来很大的麻烦.因为数据库 ...

  5. 如何在MySQL中设置外键约束

    MySql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个:     一个是让数据库自己通过外键来保证数据的完整性和一致性     一个就是能够增加ER图的可读性     有些人认为外键的建 ...

  6. 在mysql中如何添加外键约束_如何在MySQL中设置外键约束

    (1) 外键的使用: 外键的作用,主要有两个: 一个是让数据库自己通过外键来保证数据的完整性和一致性 一个就是能够增加ER图的可读性 有些人认为外键的建立会给开发时操作数据库带来很大的麻烦.因为数据库 ...

  7. mysql外键约束cascade_mysql外键约束foreign key ON DELETE CASCADE ON UPDATE CASCADE

    正 文: 一,什么是foreign key,及其完整性 个人觉得,foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强.关于完整 ...

  8. mysql不能删除外键吗,MySQL不能删除外键约束所需的索引

    MySQL不能删除外键约束所需的索引 我需要改变现有的数据库添加一列. 因此我也想更新UNIQUE字段来包含这个新列. 我试图删除当前的索引,但不断收到错误MySQL Cannot drop inde ...

  9. mysql级联删除外键约束_mysql通过外键级联删除

    mysql 可通过外键约束,实现数据的级联更新或者删除. 例如有主表(员工排班表): CREATE TABLE `personal_schedule` ( `id` int(11) NOT NULL  ...

最新文章

  1. 读德鲁克的《管理的实践》,我才明白,这些年,我错过了什么
  2. 深入理解position:relative 与 position:absolute(divb相对于diva进行绝对定位)
  3. js 下拉底部加载|滑轮滚动到页面底部ajax加载数据的实例
  4. 计算机组装与维修bios设置,(完整版)计算机组装与维修模拟试题(BIOS设置的习题).docx...
  5. 贪吃蛇游戏java代码_Java实现贪吃蛇游戏
  6. 机器学习竞赛(代码)
  7. 020-python函数和常用模块-文件操作
  8. Mac使用磁盘工具创建(dmg)映像文件超详细步骤
  9. 传统的继承在JavaScript中的应用
  10. c语言文件夹换行打印,关于文件操作,碰到空格就换行
  11. 51/STC12单片机SCON,PCON,TMOD寄存器定义及功能
  12. java向指定用户极光推送_【极光推送】给指定用户发送消息
  13. python怎么做相加两个变量_2组语法,1个函数,教你用Python做数据分析
  14. 支持delete吗_那些年删过的库,跑过的路,你从中找到解决方法了吗?
  15. ireport mysql_iReport连接Mysql创建图表报表
  16. Excel批量转置——录制会循环的宏
  17. 少儿学python真的有用吗_如何看待海淀妈妈们认为Python是儿童才学的低端编程?...
  18. kms工具(2021.7.24更新)
  19. excel函数应用:如何写出IF函数多级嵌套公式
  20. 无标注数据是鸡肋还是宝藏?阿里工程师这样用它​

热门文章

  1. 重磅 | 西安思考:“2018国际人工智能院长论坛”专家思想分享
  2. 进程学习:进程间通信(传统通信方式)1.无名管道
  3. SYN5301型 时间检定仪
  4. 淘宝/天猫如何获得店铺的所有商品?
  5. Unity之Shader基础探索
  6. 在ftp服务器上打开wOrd文件空白,ftp服务器word文件打开是空白
  7. 实现redis连接池以及管道
  8. 计算机的组成:硬件和软件
  9. android - 【记录】三星手机(N9002)刷机、官方系统、TWRP
  10. 在windows配置Apache httpd代理服务器