如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式的区别和联系。

  这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。

  首先创建用户组表:

  创建用户组表

  create table t_group (

  id int not null,

  name varchar(30),

  primary key (id)

  );

  并插入两条记录:

  插入记录

  insert into t_group values (1, ‘Group1’);

  insert into t_group values (2, ‘Group2’);

  下面创建用户表,分别以不同的约束方式创建外键引用关系:

  1、级联(cascade)方式

  级联方式

  create table t_user (

  id int not null,

  name varchar(30),

  groupid int,

  primary key (id),

  foreign key (groupid) references t_group(id) on delete cascade on update cascade

  );

  参照完整性测试

  insert into t_user values (1, ‘qianxin’, 1); #可以插入

  insert into t_user values (2, ‘yiyu’, 2); #可以插入

  insert into t_user values (3, ‘dai’, 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符

  约束方式测试

  insert into t_user values (1, ‘qianxin’, 1);

  insert into t_user values (2, ‘yiyu’, 2);

  insert into t_user values (3, ‘dai’, 2);

  delete from t_group where id=2; #导致t_user中的2、3记录级联删除

  update t_group set id=2 where id=1; #导致t_user中的1记录的groupid级联修改为2

  2、置空(set null)方式

  置空方式

  create table t_user (

  id int not null,

  name varchar(30),

  groupid int,

  primary key (id),

  foreign key (groupid) references t_group(id) on delete set null on update set null

  );

  参照完整性测试insert into t_user values (1, ‘qianxin’, 1); #可以插入

  insert into t_user values (2, ‘yiyu’, 2); #可以插入

  insert into t_user values (3, ‘dai’, 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符

  约束方式测试

  insert into t_user values (1, ‘qianxin’, 1);

  insert into t_user values (2, ‘yiyu’, 2);

  insert into t_user values (3, ‘dai’, 2);

  delete from t_group where id=2; #导致t_user中的2、3记录的groupid被设置为NULL

  update t_group set id=2 where id=1; #导致t_user中的1记录的groupid被设置为NULL

  3、禁止(no action / restrict)方式

  禁止方式

  create table t_user (

  id int not null,

  name varchar(30),

  groupid int,

  primary key (id),

  foreign key (groupid) references t_group(id) on delete no action on update no action

  );

  参照完整性测试

  insert into t_user values (1, ‘qianxin’, 1); #可以插入

  insert into t_user values (2, ‘yiyu’, 2); #可以插入

  insert into t_user values (3, ‘dai’, 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符

  约束方式测试

  insert into t_user values (1, ‘qianxin’, 1);

  insert into t_user values (2, ‘yiyu’, 2);

  insert into t_user values (3, ‘dai’, 2);

  delete from t_group where id=2; #错误,从表中有相关引用,因此主表中无法删除

  update t_group set id=2 where id=1; #错误,从表中有相关引用,因此主表中无法修改

  注:在MySQL中,restrict方式与no action方式作用相同

作者:qq_34123420 发表于 2016/09/13 23:11:20 原文链接 https://blog.csdn.net/qq_34123420/article/details/52530756

总结mysql的三种外键约束方式的更多相关文章

  1. MySQL|RESTRICT|NO ACTION|CASCADE| SET NULL四种外键约束

    外键约束比较多得两种情况: 1.父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败: ON UPDATE CASCADE ON DELETE RESTRICT 1 2.父表更新时子表也更新, ...

  2. MySQL的四种外键

    来自:某一位网友的博客    转自:http://blog.csdn.net/cnjsnt_s/article/details/5548280 具体使用时需要参考:http://blog.csdn.n ...

  3. mysql启动和关闭外键约束的方法(FOREIGN_KEY_CHECKS)

    在MySQL中删除一张表或一条数据的时候,出现 [Err] 1451 -Cannot delete or update a parent row: a foreign key constraint f ...

  4. mysql 启动和关闭外键约束

    在MySQL中删除一张表或一条数据的时候,出现 [Err] 1451 -Cannot delete or update a parent row: a foreign key constraint f ...

  5. mysql数据库中表的外键约束

    一.外键约束 1.什么是外键? 外键指的是其他表中的主键,当做该表的外键. 2.创建外键. 2.1 可在创建表的时候直接创建外键,如图所示: create table table_name  (字段名 ...

  6. MySQL 如何删除有外键约束的表数据

    今天删除数据库中数据,提示因为设置了foreign key,无法修改删除 可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况. SET FOREIGN_KEY_CHECKS=0; 删除 ...

  7. mysql外键约束总结

    总结三种MySQL外键约束方式 如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是 ...

  8. MYSQL外键约束的参照操作

    如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常 ...

  9. Oracle表中添加外键约束

    添加主键约束: ALTER TABLE GA_AIRLINE ADD CONSTRAINT PK_AIRLINE_ID PRIMARY KEY(AIRLINE_ID); 有三种形式的外键约束: 1.普 ...

随机推荐

  1. 用sqlplus为oracle创建用户和表空间

    用Oracle自带的企业管理器或PL/SQL图形化的方法创建表空间和用户以及分配权限是相对比较简单的, 本文要介绍的是另一种方法就是使用Oracle所带的命令行工具SQLPLUS来创建表空间. 打开S ...

  2. Confluence 6 为登录失败编辑,禁用和配置验证码

    在默认的情况下,验证码将会在失败登录次数达到的时候显示. 如果为登录失败编辑,禁用和配置验证码: 在屏幕的右上角单击 控制台按钮 ,然后选择 General Configuration 链接. 在左侧 ...

  3. Confluence 6 服务器的许可证信息

    Confluence 6 服务器的许可证信息. https://www.cwiki.us/display/CONFLUENCEWIKI/Managing+your+Confluence+License

  4. Confluence 6 用户目录图例 - Confluence 内部目录

    上面的图:Confluence 使用内部目录为用户管理. https://www.cwiki.us/display/CONFLUENCEWIKI/Diagrams+of+Possible+Config ...

  5. 第十九单元 nfs服务

    ===============服务端 介绍: NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过 ...

  6. cf478d 线性dp好题

    /* 给定r个红块,g个绿块,按要求堆放 问当堆放成最大高度时,有多少种可能的堆放方式 排列要求:1.第i行放i块 2.每行同色 首先当然要确定能够放置几行 设红块有r个,绿块有g个,那么放置h行需要 ...

  7. Spring Boot的Listener机制的用法和实现原理详解

    之前在介绍了在spring-boot启动过程中调用runner的原理,今天我们介绍另外一种可以实现相似功能的机制:spring-boot的Listener机制. 通过注册Listener,可以实现对于 ...

  8. String 类的实现(1)浅拷贝存在的问题以及深拷贝实现

    1.   浅拷贝 : 也称位拷贝 , 编译器只是直接将指针的值拷贝过来, 结果多个对象共用 同 一块内存, 当一个对象将这块内 存释放掉之后, 另 一些对象不知道该块空间已经还给了系统, 以为还有效, ...

  9. c++实现 给定直角停车位两个点,求取剩余两点坐标。

    //2018-09-08-fourmi /*************************include head files************************************ ...

  10. Scrapy库的安装(windows版)

    这个是需要安装的所有文件 1. wheel pip install wheel 2. lxml http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml 3. P ...