MySQL基础操作——约束(下)——期末快速复习

一、主键约束

简单来说,就是在创建表的时候在字段类型后面添加primary key 这个词组。
注意:1. 一个表只能有一个主键,但可以是多个字段一起组成主键,那就是复合主键 单值主键与复合主键的区别: 单值主键的话是作为主键的字段,前面插入的数据与要插入的数据是一定不重复的,重复就会报错 复合主键的话,是作为主键的字段一起不与前面插入的数据重合才能创建,也就是说比如 我 一个表中有id和num这两个字段作为主键,比如里面有 id:100,num:15,那我后面插入的数据可以是id:100,num:20,或id:30,num:15,只有id:100,num:15这种情况才会报错,它的使用场景可以是学生选课,同一名学生可以选不同的课,相同的课也可以是不同的学生选。
SQL语句对上述的概念的实操:
create table tt13 ( id int unsigned primary key comment '学号不能为空', name varchar(20) not null)
这是单值主键的创建表
如果创建表时没有创建主键可以追加主键
alter table '表名' add primary key('字段名')
也可以删除主键:
alter table '表名' drop primart key
这是复合主键的创建表

比如:学生选课,

复制代码
 create table pick_course(
 student_id int unsigned comment '这是学生的学号',
course_name varchar(10),
student_name varchar(20) not null
primary key(student_id,course_name) ;
这样就达到了插入数据时,相同学生只能选不同学科,相同的学科可以被不同的学生选。

二、唯一键约束

唯一键的作用跟主键的效果是一样的,加了这个约束的字段,不能出现相同的数据,与主键的区别就是它插入数据时可以允许插入空数据
我想很多人都会有跟我刚学的疑问,既然与主键效果一样,那为什么不都用主键呢?
我举个例子你就懂了 比如在员工表中有这个公司给的每个人的工号,还有身份证号,名字。我们知道每个人的工号是不同的,身份证号也不同,名字可能同名,这种情况就要有约束了,如是两个都是主键的话,就意味着相同工号的人可以插入不同的身份证号,相同的身份证号可以是不同工号的人,这个在实际生活中不是不符合实际的吧,所以,两个都为主键就达不到一个工号对应一个身份证号了,所以就要唯一键的到来,如果把工号作为主键,身份证号作为唯一键,那就可以完成一个工号对应一个身份证号了,为了理解也可以认为这样的操作时多个单值主键,使得单个字段的唯一性确定更强了
注意:一个表中能有多个唯一键,只要在每个字段创建的过程中加上 unique key就行
SQL语句的实操,就拿我上面那个例子写
create table employee(
employee_id int unsigned primary key(key可以省略),
employee_name varchar(20) not null,
employee_card_id int unsigned unique key
);

在创表后添加唯一键
alter table '表名' add unique ('字段名')可以多个字段一起;
删除唯一键

alter table '表名' drop index '字段名';

三、外键约束

概念: 简单来讲就是两个或两个以上的表之间存在联系,这个联系的纽扣就需要外键来当媒介,约束两张表间即存在联系,又不互相矛盾
外键是什么: **就是一个表中的一个字段去联系另外一个字段的主键或唯一键,通过这个字段能快速找到与当前表有关系的的数据。**我们把拥有外键的表叫做从表,外键联系的那张表叫主表
举个例子:
比如两张表,一张为学生表有id和name,一张为成绩表有id和各个科目的成绩,可以看出,成绩表的id对应学生表的id所以,成绩表可以做学生表的从表,也就是说id就是外键
外键的好处:如上面例子,如果我们要改某个学生的名字就只要学生表里改,成绩表不用动。如果学生姓名插入成绩表的话就是相当于一张表表示,如果改名字的话,各个科目的名字都要改,就很重复效率低。 , 所以能看出,有了主从表的关系后,修改数据就很方便,就只要改从表或主表的任意一个表的数据就能有正确的数据表达
SQL语句的实操

就拿上面的例子
学生表:
create table student(
student_id int unsigned primary key comment '学生学号',
student_name varchar(20) not null comment '学生姓名'
);
成绩表:
create table student_score(
student_id int unsigned,
chinese_score double unsigned not null default 0,
math_score double unsigned not null default 0,
foreign key(student_id) references student(主表名)(student_id)
);
注意:如果你要删除主表的某个字段的话,如果这个字段的数据还存在于从表插入的数据就删不了。 就是比如上面例子,我想删除student里的student_id的话,要保证成绩表约束的外键student_id没有插入数据才能删 还有在从表插入数据时,作为外键的字段插入的数据要在主表中存在才能插入 比如: 学生id只有1001,如果的成绩表插入1002的成绩时就会报错,也就是说,从表的作为外键的字段只能存在主表主键或唯一键已存在的数据

相关推荐
fengxin_rou1 小时前
【MySQL 事务并发实战】:隔离级别、MVCC 与幻读问题彻底解
数据库·mysql·事务·并发
白开水就盒饭1 小时前
《数据挖掘(主编:吕欣、王梦宁)》读书笔记总结
python·mysql·数据挖掘·知识图谱
bqq198610261 小时前
非关系型数据库概述
数据结构·数据库·非关系型数据库
@insist12310 小时前
信息安全工程师-数据库安全全体系解析与最佳实践
数据库·安全·软考·信息安全工程师·软件水平考试
_ku_ku_11 小时前
数据库系统原理 · 事务管理与恢复 · 自学总结
数据库·oracle
lifewange12 小时前
Redis 集合(Set)运算完全指南
数据库·chrome·redis
TDengine (老段)12 小时前
TDengine RAFT共识协议 — 选举、日志复制、快照与仲裁
android·大数据·数据库·物联网·架构·时序数据库·tdengine
Full Stack Developme13 小时前
Spring Boot 事务管理完整教程
java·数据库·spring boot
m0_7020365315 小时前
mysql如何通过索引减少行锁范围_mysql索引与加锁逻辑
jvm·数据库·python