MySQL外键约束要求与参照操作
文章目录
- 约束
- FOREIGN KEY 外键约束
- 如何编辑数据表的默认存储引擎
- 外键约束的创建
- 外键约束的参照操作
- 表级约束和列级约束
约束
1.约束是为了保证数据的完整性和一致性
2.约束分为表级约束和列级约束
(1)如果约束针对一个字段进行约束,那么就称为列级约束
(2)如果针对两个以上字段的约束,那么就称为表级约束
3.约束类型包括
(1)NULL --非空约束
(2)PRIMARY KEY --主键约束
(3)UNIQUE KEY --唯一约束
(4)DEFAULT --默认约束
(5)FOREIGN KEY --外键约束
现在来说外键约束,其他约束在上篇文章的mysql基础用法中
FOREIGN KEY 外键约束
两个目的
1.保证数据的一致性,完整性
2.实现一对一,一对多的关系
这也就是将很多数据库称之为“关系型数据库的关系”的根本原因
在mysql中,如果要创建外键约束,肯性需要有一些要求
1.要求父表和子表必须使用相同的存储引擎,而且禁止使用临时表。
(1)所谓的子表指的是具有外键列的表,称之为“子表”
(2)而子表所参照的表,我们称之为父表
2.存储表的数据引擎只能为innoDB。
3.外键列和参照列必须具有相同的数据类型,如果是数字的话则要求数字的长度以及是否有符号位这些属性必须相同,而字符长度可以不同。
(1)曾加过FOREIGN KEY关键词的那一列,我们称之为外键列
(2)而外键列所参照的那一列称之为参照列
4.外键列和参照列必须创建索引。参照列没有索引的话MySQL将自动创建索引,外键列不存在索引,mysql不予理睬。
如何编辑数据表的默认存储引擎
MySQL配置文件
default-storage-engine=INNIDB
如果忘记了mysql安装路径,则用一下命令查找
show variables like "%char%";
更改后重新启动mysql的服务
外键约束的创建
那么相同的引擎,且存储引擎只能为INNODB这个条件就已经满足了
那么
外键列和参照列必须具有相同的数据类型,如果是数字的话则要求数字的长度以及是否有符号位这些属性必须相同,而字符长度可以不同
我们来创建两张表,让他们存在相同的数据类型
第一张:省份表(provinces)
CREATE TABLE provinces(-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,-> pname VARCHAR(20) NOT NULL-> );
那么这张表是否使用了我们创建的默认引擎呢?
我们可以通过命令查看
SHOW CREATE TABLE provinces;
引擎没错
在provinces中只要id和省份名两个字段,下边来创建另外的一张数据表
首先来两个字段,一个id,一个用户名,除了存储这两个字段以外,加入我还想存储用户所在的省份,以前我们需要加一个省份的字段,添加为字符类型,现在有了关系型数据库,我们只需要存储省份的编号即可,所以我们来存储pid,用其来存储省份的编号,这个pid以后就是我们的外键,参照主键包provinces,也就是我们的父表中的id的字段,现在我们先来试一下数据类型不一致能否实现我们的外键约束。
CREATE TABLE users(-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,-> username VARCHAR(20) NOT NULL,-> pid BIGINT,-> FOREIGN KEY (pid) REFERENCES provinces (id)-> );
告诉我们不能添加外键约束,为啥尼,因为数据类型不一致
修改一下
CREATE TABLE users(-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,-> username VARCHAR(20) NOT NULL,-> pid SMALLINT,-> FOREIGN KEY (pid) REFERENCES provinces (id)-> );
依然不可以,因为我们父表中设置的是有符号位,这里没有设置,默认是无符号位,是不是这里不可以尼?
CREATE TABLE users(-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,-> username VARCHAR(20) NOT NULL,-> pid SMALLINT UNSIGNED,-> FOREIGN KEY (pid) REFERENCES provinces (id)-> );
嗯嗯,蒙对了,看来是这样的。
这里大家就要必须清楚
1、父表子表分别指的是谁
2、users,有外键的这张表称之为子表,我们多参照的表,provinces则称之为父表
3、引擎都为INNODB
4、外键列和参照列具有相同或类似的数据类型(在数字的情况下,必须相同,字符情况可以不同)
5、外键列和参照列必须创建索引,因为我们参照列中id已经添加了主键,主键在创建的同事会自动添加索引,所以说参照列已经有了索引
我们来证明一下是否存在索引
SHOW INDEXES FROM provinces\G;
可见我们的id字段上已经存在索引,所以说我们当前的参照列上已经有了索引,那外键列上我们并没有为pid指定主键,那有没有创建索引呢?
SHOW INDEXES FROM users\G;
我们可以发现在users表中一共存在两个外键,一个是主键索引,id字段上我们创建主键已经添加了索引,除此之外在pid上已自动的创建索引,我们查看一下users表
我们可以清晰的看到,除了我们家的primary key (id)以外,key pid是系统给我们自带的,实际上就已经给我们加了索引,也可以看见曾经写过的constrint约束 ,foreign key典型的外键约束
外键约束的参照操作
创建外键的时候我们还可以写上针对于外键约束的参照的一些操作
在参照操作中一共存在四个选项,分别是cascade,set null, restrict,no action,是指在进行了外键越是的创建以后在更新表的时候子表是否也进行了响应的操作,我们来看一看
1、CASCADE:从父表中删除或更新且自动删除或更新子表中匹配的行
2、SET NULL:从父表中删除或更新行,并设置子表中的外键列为null。如果使用该选项,必须保证子表列没有设置NOT NULL
3、RESTRICT:拒绝对父表的删除或更新操作
4、NOT ACTION:标准的SQL关键字,在MySQL中与RESTRICT相同
下边来举例说明:
刚才的users表没有任何参照操作,我们来新建一张,操作添加cascade
CREATE TABLE users(-> id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,-> username VARCHAR(20) NOT NULL,-> pid SMALLINT UNSIGNED,-> FOREIGN KEY (pid) REFERENCES provinces (id) ON DELETE CASCADE-> );
CASCADE是指从父表中删除或更新且自动删除或更新子表中匹配的行,我们来做个试验,既然后更新相应的行,也就代表我们必须在数据表准存在着相应的记录才可以,所以说我们要分别在两张表中插入记录,另外如果我们要在两张表中插入记录的话,我们一定要注意,必须现在父表中cha插入记录,因为子表操作的是父表中的信息,如果父表中不存在信息,那么子表就无法参照,所以我们必须现在provinces中插入记录,刚才的省份表只有两个字段,一个id一个pname,id是主键自动编号,我们就只插入省份名即可,
INSERT provinces(pname) VALUES("A");
INSERT provinces(pname) VALUES("B");
INSERT provinces(pname) VALUES("C");
SELECT *FROM provinces;
嗯嗯,插进去了,没问题
那我们向子表插入数据
我们的子表users1,三个字段,分别是id,和 username 和pid,id是主键,所以我们只需要插入username和pid即可,也就是用户名和对应的用户所在省份
INSERT users1 (username,pid) VALUES ("TOM",3)
INSERT users1 (username,pid) VALUES ("JOHN",1)
INSERT users1 (username,pid) VALUES ("ROSE",3)
也就是TOM是C省的
JOHN是A省的
ROSE也是C省的
就这个个意思
这个时候我妈们把provinces表中的C省这条记录删除掉,
DELETE FROM provinces WHERE id = 3;
删除成功并告诉我们1条记录被影响
查一下provinces,数据删除掉了
在查一下users1表
这就验证了我们外键操作CASCADE,当参照表中记录删除或更改子表自动删除或更新匹配行,没有毛病吧,如果,不想删,子表变成null,那就用SET NULL即可,注意子表列不可设置为not null
表级约束和列级约束
约束按照不同的标准来划分,不同的结果,我们之所以把它划分为not null,主键约束,唯一约束,是根据他的功能实现的,而如果说按照操作数目的多少,我们能把它划分成表级和列级约束,
对于一个数据列所创建的约束,我们称之为列级
对于多个数据列所创建的约束,我们称之为表级
列级约束在使用的时候既可以既可以在列定义的时候声明,也可以在列定义以后声明
而表级的约束只能在列定义以后声明
not null约束和default约束就不存在表级约束,只有列级约束,对于其他的三种,主键primary key ,唯一约束unique key,外键约束foreign key他们都可以存在表级和列级约束
MySQL外键约束要求与参照操作相关推荐
- mysql 外键约束_MySQL之外键约束(FOREIGN KEY)
定义: MySQL外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列.一个表可以有一个或多个外键. 外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每 ...
- mysql外键约束怎么写_mysql外键约束怎么写
mysql外键约束的写法:[[CONSTRAINT ] FOREIGN KEY 字段名 REFERENCES 主键列1].外键约束是表的一个特殊字段,经常与主键约束一起使用. 在 CREATE TAB ...
- mysql外键约束详解_详解MySQL 外键约束
详解MySQL 外键约束,西欧,西西里,玛雅,兵种,诺曼 详解MySQL 外键约束 易采站长站,站长之家为您整理了详解MySQL 外键约束的相关内容. 官方文档: https://dev.mysql. ...
- MySQL外键约束(FOREIGN KEY)
MySQL外键约束(FOREIGN KEY) MySQL 外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列.一个表可以有一个或多个外键. 外键对应的是参照完整性, ...
- MySQL外键约束On Delete、On Update各取值的含义
主键.外键和索引的区别? 主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 主索引(由关键字PRIMARY定义的索引) ...
- MySQL——外键约束
设置外键约束(FOREIGN KEY, FK ) MySQL外键约束是表的一个特殊字段,经常与外键约束一起使用.对于两个具有关联关系的表而言,相关字段中主键所在表称为主表(父表),外键所在表称为从表( ...
- mysql 外键约束
mysql外键约束 概念:外键约束是让两个表数据之间建立连接保证数据的一致性和完整性 语法: – 添加约束 创建表时添加约束 create Table 表名{列名 数据类型,--[constraint ...
- mysql外键约束语句级连_mysql之外键约束(级联操作等) 父表子表
不理解的地方标注问号. 网上不同的博客讲的,之间似乎有些矛盾,求推荐好书. 写得不好请指出错误. 父表和子表 当两个表建立一对多关系的时候,"一"的那一端是父表,"多&q ...
- MySQL 外键约束 以及 级联操作
外键约束 --- 将一个列添加外键约束与另一张表的主键(唯一键)进行关联之后,这个外键约束的 列 添加的数据 必须要在 关联的 主键字段 中存在 方案 1 : 1.首先先创建没有关系的班级表 2.再创 ...
最新文章
- 【每日一算法】相同的树
- GridView中TextBox 有内容,选中当前行CheckBox
- 递归 和 迭代 斐波那契数列
- 洛谷P3390 【模板】矩阵快速幂
- 2017.10.26 星际贸易 思考记录
- 红帆参加HiMSS 2010(2010亚太区卫生信息大会)
- 《计算机网络实验》网络参数配置与常用网络命令使用,超级详细教程
- Unity编辑器修改图片的大小
- PYTHON h5py库包安装及读写
- BIM技术在装饰装修工程中的应用
- Vivado与Modelsim联合仿真配置【图文并茂】
- TensorRT加速
- Javaweb学生信息管理系统(源码)
- 亚马逊测评地址有哪些风险?账号网络需要注意
- excel导入mysql并批量查询_Excel导入MySql数据库批量操作
- xiao297328是个骗子,大家注意了啊
- linux-为php添加curl扩展
- [MAC]如何通过 macOS 恢复功能重新安装 macOS
- Android高德地图配置及实现定位,目的地路线规划的路线绘制
- win10系统下 ABBYY SDK安装及iKey激活