文章目录

  • 外键的定义
  • 如何删除外键关系的两张表(父表 子表)的数据
    • 方式一
    • 方式二
  • 两张表互为外键约束,删除任何一张表都会出错

为了保证数据完整 ,有一种方式就是两张表设置外键foreign key。 但是删除操作 如果只删除主键表的行数据会报外键约束异常。

外键的定义

如果一个字段X在一张表(表一)中是主关键字,而在另外一张表(表二)中不是主关键字,则字段X称为表二的外键;换句话说如果关系模式R1中的某属性集不是自己的主键,而是关系模式R2的主键,则该属性集称为是关系模式R1的外键。

二:主键表和外键表的理解

(1)以公共关键字作主键的表为主键表(父表,主表)

(2)以公共关键字作外键的表为外键表(从表,外表)
举个例子:

这里有2张表(student和depart)学生表和院系表,这里的字段departNum就是学生表的外键,这里的外键表是学生表,主键表是院系表。

DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (`openid` char(50) NOT NULL DEFAULT '',`pk_userid` bigint(20) unsigned DEFAULT NULL,`nickname` char(60) DEFAULT NULL,`gender` char(10) DEFAULT NULL,`city` char(60) DEFAULT NULL,`province` char(60) DEFAULT NULL,`country` char(60) DEFAULT NULL,`avatar_url` char(150) DEFAULT NULL,`gmt_create` datetime NOT NULL,`gmt_modified` datetime NOT NULL,PRIMARY KEY (`openid`),KEY `user_info_ibfk_1` (`pk_userid`),CONSTRAINT `user_info_ibfk_1` FOREIGN KEY (`pk_userid`) REFERENCES `user` (`pk_userid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

on delete 规则策略:

1、CASCADE:级联

  REFERENCES `user` (`pk_userid`) ON DELETE CASCADE ON UPDATE CASCADE

(1)所谓的级联删除,就是删除主键表的同时,外键表同时删除。

(2)以上面的例子将就是,假如院系表中的某个院系被删除了,那么在学生表中要想查询这个被删除的院系号所对应的院信息就会报错,因为已经不存在这个系了,所以,删除院系表(主键表)时必须删除其他与之关联的表,这里就说明了外键的作用,保持数据的一致性、完整性。当然反过来讲,你删除学生表中的记录,并不影响院系表中的数据,你查询院系号也能正确查询。所以删除外键表中的数据并不影响主键表

更改外键删除时的处理策略来实现的,相对来说比较简单,但是同时也可能会带来某些其他问题。
当然,两个相互关联的表,某张表更新时,另外一张表跟着更新的也应该使用CASCADE策略

2、NO ACTION(非活动,默认)、RESTRICT:约束/限制
当取值为No Action或者Restrict时,则当在主键表中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除。(即外键表约束主键表)
3、SET NULL
当取值为Set Null时,则当在主键表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(,一样是外键表约束主键表,不过这就要求该外键允许取null)。

NO ACTION和RESTRICT的区别:只有在及个别的情况下会导致区别,前者是在其他约束的动作之后执行,后者具有最高的优先权执行。

如何删除外键关系的两张表(父表 子表)的数据

方式一

你先删除主表中的数据,那子表中的外键就没有对应的主键了,所有会报错误,你先删了子表中的数据,然后删除主表中的数据就OK了。

要删除的数据由于有外键关系不能删除的话,就先删除外键所在的表的行数据,然后删除对应的主键表的行数据 这样删除是一个完整的删除,想要只删除主键表的行数据由于外键关系是不能删除的。

方式二

首先,在数据库中查看外键是否有效(没有设置之前都是有效),命令:select@@foreign_key_checks;
将外键的值设置为0,此时就是失效状态,命令:
set foreign_key_checks = 0,这时就能删除数据了。
删除之后,外键再设置为有效:set foreign_key_checks = 1

两张表互为外键约束,删除任何一张表都会出错

解决方法:临时关闭检查

语法:set @@foreign_key_checks=OFF;

https://blog.csdn.net/metheir/article/details/81877055
https://blog.csdn.net/smileyan9/article/details/89422139

如何删除有外键关系的两张表的数据相关推荐

  1. MySQL如何同时删除主外键关联的两张表中的数据

    1. 编写目的 介绍一种方法,解决如下问题:如何同时删除两张相关联的表的记录. 比如说表a的外键fk依赖于表a的id,现在我们需要删除id=5的两条数据. 2. 主要方法 为了简单,推荐更改表a的外键 ...

  2. mysql查询某张表的所有外键_oracle中查询所有外键引用到某张表的记录

    欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 oracle中查询所有外键引用到某张表的记录 //查询表的主键约束名 select * from user_constr ...

  3. 关于跨DB增量(增、改)同步两张表的数据小技巧

    有些场景下,需要隔离不同的DB,彼此DB之间不能互相访问,但实际的业务场景又需要从A DB访问B DB的情形,这时怎么办?我认为有如下常规的三种方案: 1.双方提供RESET API,需要访问不同DB ...

  4. 对比两张表的数据并筛选出数据不同的

    描述: 表A和表B的主键A1和B1是相同的,现在需要A2和B2比较,A3和B3比较,将A2不等于B2和A3不等于B3的数据从表A中筛选出来.这样的SQL语句怎么写? SQL语句对比两张表的数据并筛选出 ...

  5. oracle两张表 比较好,比较Oracle两张表的数据是否一样

    比较Oracle两张表的数据是否一样 爱搞机 2008-10-21 11:00 在某些情况下,我们会需要比较两张表的数据是否一样. 假设有两张表A与表B他的字段相同,但是当中的数据可能不同,而且有些字 ...

  6. 比较两张表的数据是否相同

    在某些情况下,我们会需要比较两张表的数据是否一样. 假设有两张表A与表B他的字段相同,但是当中的数据可能不同,而且有些字段的数据还有可能为空 方法一(手动):把需要比较的两张表的数据按照某种规则排序后 ...

  7. sqlserver如何把两张表的数据合并为一张表

    今天在公司做项目的时候遇到一个情况,有两张临时表A(inco varchar(50)).表B(qty varchar(50)) 需要将这个两个表的数据插入到一张临时表中C(inco varchar(5 ...

  8. Oracle 对比两张表的数据是否一致

    使用 minus 关键字(minus:差别,缺少) 有两张表CHECK_CITY_1和CHECK_CITY_2,现在要互相对比一下,两个表数据的差异,(即A中有哪些B里没有,B中有哪些A中没有) se ...

  9. python做值班表预测_Django model一张表中两个字段设置外键参考另一张表两个字段...

    class products(models.Model): MODE_CHOICES=(('week','周'),('day','日')) productname=models.CharField(m ...

最新文章

  1. 有哪些适合远程办公的软件值得推荐?
  2. mysql数据库解除外键
  3. stanford-parser for C#
  4. mysql检索整数_MyBatis从MySql DB中检索整数为Enum
  5. 数据意识崛起,从企业应用看BI软件的未来发展
  6. 怎么提高文公写作水平?公文写作礼仪类模板(1)
  7. electron使用regedit模块时的正确配置方法
  8. cad尺寸标注快捷键_CAD快速在尺寸标注后加上公差的方法有哪些?【AutoCAD教程】...
  9. 发票查验一直网络异常、无法显示验证码、点击查验没反应怎么办?
  10. centos7.1 修改selinux相关机制后出现开机失败,报错faild to load selinux policy  freezing
  11. [听风]TBC单体插件头像显示ShadowedUnitFrames
  12. 删除商品信息恢复的java_零基础学习java------35---------删除一个商品案例,删除多个商品,编辑(修改商品信息),校验用户名是否已经注册(ajax)...
  13. html表单元素占位符是,HTML各种表单元素模板及写法
  14. leetcode常用思路总结与文章索引
  15. linux扩展堆函数,linux下进程堆栈下溢出判断及扩展实现
  16. A星融合DWA的路径规划算法,可实现静态避障碍及动态避障,代码注释详细,matlab源码
  17. EXSI6.7.0安装
  18. 机械工程基础知识点汇总
  19. windows远程linux的工具
  20. 华为200万年薪招聘AI应届生——有多少本事,给多少钱

热门文章

  1. php 可视化模板编辑,MetInfo
  2. Jetson AGX Orin 平台关于c240000 I2C总线和GMSL ses地址冲突问题
  3. 维度建模和范式建模对比
  4. 新闻列表 android,- Android中实现简单的新闻列表
  5. OpenGL | 设置视口glViewport 裁剪glScissor 屏幕截图 glReadPixel
  6. 深度学习:从2D卷积到3D卷积的简单理解
  7. C++实现九九乘法 (by yzs-device)
  8. 空间三点定圆的解算过程
  9. 助企开门红 浙江省科技厅厅长高鹰忠一行到访加速科技
  10. 散转程序c语言,单片机 散转程序设计 软件实验