1.外键

  • 建表时添加外键:constraint 外键名 foreign key 从表字段 references 主表字段 级联操作
create table dage(                        create table xiaodi(
dage_id int primary key, xiaodi_id int,
name char(10) name char(10),
); dage_id int,
constraint fk foreign key(dage_id) references dage(dage_id));
  • 建表后添加外键:alter table 表名 add constraint 外键名 foreign key(字段1) references 表名2(字段名) 级联操作
  • 查看:①desc 表名; ②show create table 表名
  • 删除:alter table 表名 drop foreign key 外键名

注意:设置了外键的表是从表,它关联的表被称为主表;给从表插入数据时,插入数据必须是主表的被关联字段出现的数据;先建主表再建从表;先删从表再删主表。

2.级联操作

  • on delete cascade:主表中的数据被删,从表中相关数据也会被删
  • on update cascade:主表中的数据被改后,从表中的相关数据也会被修改
  • on delete cascade on update cascade:删除和修改有级联操作
  • on delete set null:主表总数据被删除后,从表中相关数据为null
  • on update set null

3.示例

一个用户可有拥有多个订单,一个订单只能属于一个用户,一对多,在tb_order中使用外键user_id关联tb_user的id。

当删除、更新tb_user中的主键时,与之关联的tb_order要受到影响,比如

#tb_user中的一条记录 

1  chy  abcd 

#tb_order中一条记录,10是tb_order的id,1是所属user的id 

10 ......  1 

删除tb_user中id=1这条记录,或者更新id字段的值,mysql会如何处理tb_order中与之关联的记录?

设计外键时,mysql提供了4种外键关联策略

1、RESTRICT   限制(默认策略)

要删除tb_user中的记录,或者更新主键字段的值,如果tb_order中有记录与之关联,则不能删除、更新(执行操作时会报错)

2、CASCADE   级联

删除tb_user中的记录时,会自动删除tb_order中与之关联的记录;

修改tb_user中id字段的值时,会自动修改tb_order中与之关联的记录的外键字段的值(同步变化)。

3、NO ACTION   什么也不做

删除tb_user中的记录,或者修改id字段的值,但tb_order中有记录与之关联,可以删除、更新,tb_order中与之关联的记录不作任何处理(数据不发生变化)。

此种策略需要存储引擎支持,如果存储引擎不支持,会自动换为RESTRICT。

4、SET NULL   置为NULL

删除tb_user的记录,或更新主键字段的值,会自动将tb_order中与之关联的记录的外键字段的值置为NULL。

这种方式有一个要求:设计tb_order时,外键user_id不能使用NOT NULL约束。

CASCADE用得最多,其次是RESTRICT,未设置外键关联策略时默认为RESTRICT(为了数据安全)。

http://www.cppblog.com/wolf/articles/69089.html

Mysql 外键级联

MySQL外键之级联

Mysql外键级联与级联的劣势

mysql外键策略的更多相关文章

  1. mysql 外键约束备注

    梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...

  2. MySQL外键之级联

    简介 MySQL外键起到约束作用,在数据库层面保证数据的完整性.例如使用外键的CASCADE类型,当子表(例如user_info)关联父表(例如user)时,父表更新或删除时,子表会更新或删除记录,这 ...

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

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

  4. Mysql 外键设置

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

  5. MySQL外键的作用和创建

    MySQL外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据.使两张表形成关联,外键只能引用外表中列的值! 我们来建两个表 CREATE TABLE `example1` ( ` ...

  6. Mysql外键的使用

    MySQL外键(请确保数据库是innodb类型)网上有很多介绍的文章,这里我就凭自己的理解再次整理了下,废话不多说,直入正题哈.外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据 ...

  7. mysql 外键和子查询,视图

    1.mysql 外键约束 建表时生成外键   foreing key ('sid') references' student'('id'); 建表后添加外键  alter table' course ...

  8. mysql外键使用和事物使用

    mysql外键功能主要是为了保证关联表数据的一致性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有 客户号,客户名称 b表中存 ...

  9. Mysql外键设置中的CASCADE、NO ACTION、RESTRICT、SET NULL

    转: Mysql外键设置中的CASCADE.NO ACTION.RESTRICT.SET NULL 2017年06月11日 10:03:13 雅静8 阅读数:5491   版权声明:本文为博主原创文章 ...

随机推荐

  1. Linux&C———进程间通信

    管道和有名管道 消息队列 共享内存 信号 套接字 由于进程之间的并不会像线程那样共享地址空间和数据空间,所以进程之间就必须有自己特有的通信方式,这篇博客主要介绍自己了解到的几种进程之间的通信方式,内容 ...

  2. svn与git区别

    代码扫描工具介绍:https://baijiahao.baidu.com/s?id=1629218655164599200&wfr=spider&for=pc Git和SVN的区别与联 ...

  3. EF Core 小技巧:迁移已经应用到数据库,如何进行迁移回退操作?

    场景描述:项目中存在两个迁移 Teacher 和 TeachingPlan ,TeachingPlan 在 Teacher 之后创建,并且已经执行 dotnet ef database update ...

  4. Java8新特性之Optional,如何优雅地处理空指针

    是什么 ​ 从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException)-- 每个 Java ...

  5. uni-app 提示 v-for 暂不支持循环数据

    这个问题由于目前博主只在APP端遇到过,解决办法是把v-for key值全部取循环的索引,如果解决了你的问题请给博主点个赞 <block v-for="(item,index) in ...

  6. [hdu6984]Tree Planting

    构造一个01矩阵,其中格子$(i,j)$​​​​​对应于第$ik+j$​​个​​​的位置(其中$0\le i<\lceil\frac{n}{k}\rceil,0\le j<k$​​​,位置 ...

  7. maven私服-仓库图

  8. redis实现最简单的锁

    <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifact ...

  9. [省选联考 2020 A 卷] 组合数问题

    题意 [省选联考 2020 A 卷] 组合数问题 想法 自己在多项式和数论方面还是太差了,最近写这些题都没多少思路,看完题解才会 首先有这两个柿子 \(k*\dbinom{n}{k} = n*\dbi ...

  10. JS 执行上下文的一次理解

    执行上下文 执行上下文概念 当代码运行时,会产生一个对应的执行环境,在这个环境中,变量会被事先提出来(变量提升),代码从上往下开始执行,就叫做执行上下文. 注:在定义变量是未直接赋值,使用默认值 un ...