首页 > 数据库 >mysql~数据完整性考虑~外键约束

mysql~数据完整性考虑~外键约束

时间:2024-05-09 11:16:02浏览次数:18  
标签:数据完整性 删除 外键 user mysql 子表 数据 id

在MySQL中,当为表添加外键约束时,可以指定在删除或更新父表记录时的行为。下面进行总结:

  1. CASCADE:当父表中的记录被删除或更新时,自动删除或更新子表中相关联的记录。这意味着如果父表中的记录被删除,那么相应的子表中与之关联的记录也会被删除。

  2. SET NULL:当父表中的记录被删除或更新时,子表中的外键列会被设置为NULL。这意味着如果父表中的记录被删除,子表中的外键列将会被置空。

  3. SET DEFAULT:当父表中的记录被删除或更新时,子表中的外键列会被设置为默认值。这意味着如果父表中的记录被删除,子表中的外键列将会被设置为预先定义的默认值。

  4. NO ACTION:当父表中的记录被删除或更新时,不采取任何动作。这意味着如果存在父表和子表之间的关联,但是父表中的记录被删除或更新时,在子表中不会发生任何变化,操作将会被拒绝。

  5. RESTRICT: 当尝试删除或者更新父表中有关联子表数据时,如果子表中存在对应的外键关联数据,则不允许操作父表数据

这些选项可以根据实际需求来选择,以确保数据的完整性和一致性。

其中,RESTRICT我再详细说明一下其作用如下:

  1. DELETE RESTRICT:当尝试删除父表中有关联子表数据时,如果子表中存在对应的外键关联数据,则不允许删除父表数据,会抛出一个错误。这样可以确保数据的完整性,避免因删除父表数据而导致子表数据无法正确关联。

  2. UPDATE RESTRICT:当尝试更新父表中被外键引用的列的值时,如果子表中存在对应的外键关联数据,则不允许更新父表数据,会抛出一个错误。这也是为了保证数据的完整性,防止因更新父表数据而导致子表数据关联出现问题。

实例

  • 建立两张表user_info和user_ext,然后user_ext中的user_id是user_info的id的外键,并使用restrict方式,如果要更新或者删除user_info中的数据时,保护了user_ext已经引用的数据。
CREATE TABLE `user_info`  (
  `id` int(11) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

CREATE TABLE `user_ext`  (
  `id` int(11) NOT NULL,
  `user_id` int(11) DEFAULT NULL,
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `user_id`(`user_id`) USING BTREE,
  CONSTRAINT `user_ext_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user_info` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

当删除主表数据(user_ext中已经存在引用的数据),会出现这个提示,不让你删除主表数据,要想删除,需要先删子表的才行

当然,如果希望在删除主键数据时,同时自动将子表数据删除,就可以在配置外键时,选择cascade即可

标签:数据完整性,删除,外键,user,mysql,子表,数据,id
From: https://www.cnblogs.com/lori/p/18181645

相关文章

  • Mysql-索引失效
    0.背景借鉴抖音“老猿说开发”总结的一句口诀。索引可能失效场景如下:模型数空运最快序号关键字含义解释1模模糊查询当使用模糊查询(比如使用LIKE操作符)时,如果查询条件的开头使用了通配符(如%),那么索引可能会失效。因为通配符在查询开始位置时,数据库无法利用索引进......
  • 在MySQL中,如果你想要查询一个字段,当该字段的值为NULL时显示为0,而不是NULL
    在MySQL中,如果你想要查询一个字段,当该字段的值为NULL时显示为0,而不是NULL,可以使用COALESCE函数或者使用IFNULL函数(在MySQL8.0及更早版本中)。这两个函数都可以用来返回第一个非NULL表达式。以下是使用COALESCE函数的示例:SELECTCOALESCE(column_name,0)AScolumn_nameFROM......
  • Mysql-Mvcc原理
    0.背景在mysql的并发访问中,有几个典型的并发场景:读-读:无需处理,都是读取,不会对数据有影响。写-写:由于都涉及到数据的修改,不可能乱改,所以没有较好的方式来处理,一般都得加锁。读-写:读写场景,加锁当然ok。不过读操作是很频繁的,一但写数据就不让读取了,这种情况是让人很难受的......
  • MySQL-09.性能分析工具的使用
    1.数据库服务器的优化步骤当遇到数据库调优问题时,思考的流程如下图。整个流程划分成了观察(Showstatus)和行动(Action)两个部分。字母S的部分代表观察(会使用相应的分析工具),字母A代表的部分是行动(对应分析可以采取的行动)。上图,就是数据库调优的思路。如果发现执行SQL时存......
  • MySQL索引创建原则
    1,2,5,6比较重要。针对于数据量较大,且查询比较频繁的表建立索引。单表超过10万数据(增加用户体验)。针对于常作为查询条件(where)、排序(orderby)、分组(groupby)操作的字段建立索引。尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。如果是字符......
  • mysql面试题
    索引失效1.模糊查询2.使用函数和计算:3.不匹配的数据类型:4.使用OR条件的不同索引列:5.复合索引的最左前缀原则:6.索引列在条件中使用负向查询:如NOTIN、NOTEXISTS、NOTLIKE等负向查询条件可能会导致索引失效。7.索引列在条件中使用NULL:当索引列中包含NULL值,并且在查询条件......
  • Mysql中的双路排序和单路排序
    在Mysql中使用orderby进行排序的时候,是可以使用到索引排序的,但是需要添加一些限制条件,例如:select*fromt_userwherename='张三'orderbyname;使用这种方式就可以使用到索引,同时使用limit也是可以使用到索引的select*fromt_userorderbyname;通过这种方式不会使用到索......
  • 你知道什么是 MySQL Online DDL 吗?
    前言MySQL在进行DDL操作时,可能会产生表锁导致阻塞,影响用户的DML操作,而OnlineDDL指的是在DDL期间,允许用户进行DML操作。本文将详细讲解MySQL各版本的OnlineDDL。关于什么是DDL和DML操作,详细介绍见MySQL操作命令总结。1.什么是OnlineDDLOnlineDDL功......
  • MySQL配置文件
    一.Linux1.MySQL5.7**MySQL5.7配置文件示例(适用于Linux)**[mysql]#设置mysql客户端默认字符集default-character-set=utf8[mysqld]#服务器端口port=3306#MySQL的安装目录basedir=/usr/local/mysql#MySQL的数据目录datadir=/var/lib/mysql#错误日志文件......
  • MySQL-安装脚本参考
    #!/bin/bash#安装MySQL程序install_mysql(){#mv/etc/yum.repos.d/*/tmp/#curl-o/etc/yum.repos.d/CentOS-Base.repohttps://mirrors.aliyun.com/repo/Centos-7.repo#wget-O/etc/yum.repos.d/epel.repohttp://mirrors.aliyun.com/repo/epel-7.repo#yuminstall-y......