MySQL中的主键约束和外键约束
1、主键约束
表通常具有包含唯一标识表中每一行的值的一列或一组列。 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性。 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束。
如果为表指定了主键约束, 数据库引擎将通过为主键列自动创建唯一索引来强制数据的唯一性。 当在查询中使用主键时,此索引还允许对数据进行快速访问。
如果对多列定义了主键约束,则一列中的值可能会重复,但来自主键约束定义中所有列的值的任何组合必须唯一。
2、外键约束
也称为引用约束或引用完整性约束,能够定义表间以及表内必需的关系。
例如,典型的外键约束可能规定 EMPLOYEE 表中的每个职员必须 是一个现有部门的成员,该部门在 DEPARTMENT 表中定义。
引用完整性是数据库的一种状态,在该状态中,所有外键的所有值都有效。外键是表中的一列或一组列,它的值需要与其父表的行的至少一个主键或唯一键值相匹配。
引用约束是这样一种规则,仅当满足下列其中一个条件时,外键的值才有效:
- 它们作为父键的值出现
- 外键的某些组成部分为空
例如,要建立此关系,应将 EMPLOYEE 表中的部门号定义成外键,并将 DEPARTMENT 表中的部门号定义成主键。
这样当在EMPLOYEE表中新添加一个员工,而其所在部门的代号在DEPARTMENT表中未出现时,这将是一个无效键记录,将被阻止。
引用约束的目的是保证表关系得到维护并遵循数据输入规则。
这意味着只要引用约束有效,数据库管理器就保证对于子表中其外键列中具有非空值的每行,相应父表中都存在一个其父键中具有匹配值的行。
3、当操作违反引用约束时,数据库管理器通过强制执行与每个引用约束关联的一组规则来处理这类情况。
当 SQL 操作尝试更改数据的方式导致引用完整性受到影响时,可能是违反了引用约束。例如,
- 插入操作可能尝试将一个数据行插入到子表中,该行的外键列中的值与相应父表的父键中的值不匹配。
- 更新操作可能尝试将子表的外键列中的值更改为一个在相应父表的父键中没有匹配值的值。
- 更新操作可能尝试将父表的父键中的值更改为一个在子表的外键列中没有匹配值的值。
- 删除操作可能尝试从父表中除去在子表的外键列中具有匹配值的记录。
此时,数据库管理器通过强制执行与每个引用约束关联的一组规则来处理这类情况。这组规则包括:
- 插入规则
- 更新规则
- 删除规则
4、引用约束的插入规则
外键的非空插入值必须与父表的父键的某些值相匹配。如果组合外键的值的任何组成部分为空,那么该值为空。指定外键时,此规则是隐式的。
5、引用约束的更新规则
引用约束的更新规则是在定义引用约束时指定的。选项有 NO ACTION 和 RESTRICT。在更新父表的某行或从属表的某行时应用更新规则。
6、引用约束的删除规则
删除规则是在定义引用约束时指定的。选项有 NO ACTION、RESTRICT、CASCADE 或 SET NULL。仅当外键的某些列允许空值时,才能指定 SET NULL。
MySQL中的主键约束和外键约束的更多相关文章
- MySQL中的主键,外键有什么作用详解
MySQL中的主键,外键有什么作用详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 学关系型数据库的同学,尤其在学习主键和外键时会产生一定的困惑.那么今天我们就把这个困惑连根拔起 ...
- MySQL数据库--外键约束及外键使用
什么是主键.外键关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键. 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯 ...
- 总结: MySQL(基础,字段约束,索引,外键,存储过程,事务)操作语法
1. 显示数据库列表 show databases; # 查看当前所有数据库 show databases \G #以行的方式显示 2. 在命令行中,执行sql语句 mysql -e 'show ...
- 2-16 MySQL字段约束-索引-外键
一:字段修饰符 1:null和not null修饰符 我们通过这个例子来看看 mysql> create table worker(id int not null,name varchar(8) ...
- MySQL数据库(4)_MySQL数据库外键约束、表查询
一.外键约束 创建外键 --- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY ...
- MySQL创建表时加入的约束以及外键约束的的意义
1,创建表时加入的约束 a) 非空约束,not null b) 唯一约束,unique c) 主键约束,primary key d) 外键约束,foreign key 1,非空约束,针对某个字段设置其 ...
- mysql字段约束-索引-外键---3
本节所讲内容: 字段修饰符 清空表记录 索引 外键 视图 一:字段修饰符 (约束) 1:null和not null修饰符 我们通过这个例子来看看 mysql> create table wo ...
- MySQL基础9-主键约束、外键约束、等值连接查询、一对一和多对多关系
1.主键约束和外键约束 外键约束 * 外键必须是另一表的主键的值(外键要引用主键!) * 外键可以重复 * 外键可以为空 * 一张表中可以有多个外键! 概念模型在数据库中成为表 数据库表中的多对一关系 ...
- Oracle的主键约束、唯一约束与外键约束
http://www.shangxueba.com/jingyan/122163.html主键: 1.主键约束: 一个表只能有一个主键约束.主键可以是单个字段,也可以是多个字段.无论是哪种情况,其所 ...
随机推荐
- node.js获取ip及mac
; (function (win) { var os = require('os'); var ifaces = os.networkInterfaces(); function NetworkUti ...
- ES6中的模板字符串使用方法
传统的 JavaScript 语言,输出模板通常是这样写的. $('#result').append( 'There are <b>' + basket.count + '</b&g ...
- Android7.0 API变更
Android N 除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更. 本文重点介绍您应该了解并在开发应用时加以考虑的一些重要变更. 如果您之前发布过 Android 应用,请注意您 ...
- redis 的使用 及 配置文件解读
redis-server命令 redis-server /usr/local/redis/conf/redis.conf #加配置文件绝对路径启动redis服务 redis-server /usr/l ...
- Vue + Webpack-simple 怎么修改生产环境下运行的端口?
开发环境下运行 npm run dev,默认运行在localhost:8080端口,想要修改端口,于是在"dev“后增加了--port 8081
- NLP - Log-linear Models
1.The Language Modeling Problem 现在抛开我们之前讲的马尔科夫模型的假设,对于一门语言的定义,肯定不能简单依赖于每个单词的前两个单词,这是常识.比如英语中 ...
- [Navicat]把1个库的数据迁移到另1个库--数据库备份
需求: 将autotest库中所包含的所有表,从连接centOS7复制1份至localhost.autotest 操作步骤: 1.将centOS7.autotest库中表结构及表数据转为sql语句:c ...
- java序列化与反序列化操作redis
笔者在使用SSM框架项目部分功能进行测试需要使用到对象的序列化与反序列化 第一种方式:jackson Demo package com.dznfit.service; import com.dznf ...
- 如何访问pod(6)
一.通过 Service 访问 Pod: 我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 control ...
- 【使用新版mysql驱动的改变】---记忆犹新
关于 版本的问题: 之前安装数据库的时候 安装的mysql 8.0 脚本文件来自5.7 的数据库 maven版本3.5.3 jdk1.8 tomcat 9 跑maven项目的时候 遇到各种问题 ...