MySQL-约束和范式

目录

约束和范式

一、关于完整性约束

创建一张表,指定一个主键

用constraint声明主键

用ALTER语句补充声明主键

删除主键的方式:

三、外键约束

设置唯一约束

设置检查约束

默认值约束

设计三范式

为什么不能将所有内容放在同一张表里面?


约束和范式

除了主外键之外的其他列,不能出现在两张表上:这句话的意思是,在一个数据库中,如果存在两张表,那么除了主键和外键之外的其他列不能同时出现在这两张表中。

一、关于完整性约束

image-20231126112337535

image-20231126112349732

1.域完整性:限制数据类型,外键约束,默认值,非空约束。

2.实体完整性:唯一约束,逐渐约束,自增列

创建一张表,指定一个主键

 CREATE TABLE temp (id int primary key);

用constraint声明主键

 create table stu_info 
 (id bigint,
  stu_name varchar(15),
  age tinyint,
  gender tinyint,
  telphone varchar(11),
  study_direction varcahr(20),
  CONSTRAINT pk_student_info primary key (id)) engine-innodb character set = utf8mb4;
 #pk_student_info  规范:pk_表名
 或者:
 create table student_info (
 id bigint,
 student_name varchar(20),
 age tinyint,
 gender tinyint,
 telphone varchar(11),
 study_direction varchar(20),
 PRIMARY KEY (student_name, telphone)
 ) engine=innodb character set = utf8mb4;
 #复合主键

用ALTER语句补充声明主键

 create table student_info (
     id bigint,
     student_name varchar(20),
     age tinyint,
     gender tinyint,
     telphone varchar(11),
     study_direction varchar(20)
     ) engine=innodb character set = utf8mb4;
 ALTER TABLE student_info add CONSTRAINT pk_student_info PRIMARY KEY (id);
 #CONSTRAINT - 约束

删除主键的方式:

 ALTER TABLE stu_info DROP PRIMARY KEY;

三、外键约束

image-20231126145407925

这张图可以大致的解释外键的作用:

1.防止脏数据

2.控制外表和主表同步数据

什么是外键:简单地说,就是“子表”中对应于“主表”的列,在子表中称为外键或者引用键

他的值要求与主表的主键或者唯一键相对应,外键用来强制引用完整性,例如在成绩表中,学号为外键,一个表可以有多个外键。

image-20231126144151333

对比这三张表对我们数据库中的表创建外键

创建外键:

  • 首先给stu_info和stu_grade两张表创建好主键

  • 然后让stu_grade中的sid作为外键指向stu_info中的主键

image-20231126153044869

此时在stu_grade这个外表中无法插入stu_info主表中不存在的 sid ,我们可以来做个实验:

image-20231126152050741

给stu_grade这张表设置外键,外键的内容如图所示(其中删除时和更新时中的选项restrict表示限制,cascade表示级联操作),值得注意的是在设置外键的时候有这两个错误,

image-20231126152502199

image-20231126152506800

但是外键的效果还是设置成功了

设置好之后我们尝试在stu_grade表中添加stu_info没有的id数据就会报错

image-20231126152216170

当我们在主表中删除外表已经引用了主表的内容的时候也会报错(是为了防止外表中的数据变成脏数据)

image-20231126152712449

  • stu_grade中的cid作为外键指向course中的主键。

image-20231126150048039

course的主键是cid,为int类型

image-20231126153758464

所以用stu_info的cid(类型也必须为int)作为外键指向course的cid

image-20231126153737824

然后测试就是和上面的测试一样了

设置唯一约束

唯一约束,同样也是保证数据行完整性的一种

唯一约束的目的:保证某一列数据的唯一性,例如:身份证,电话号码...如果重复添加,则抛出异常

 create table student_info (
     id bigint primary key auto_increment,
     student_name varcahr (20),
     age tinyint,
     gender tinyint,
     telphone varchar(11) unique,
     study_direction varchar (20)) engine=innodb character set = utf8mb4;

image-20231126154615543

设置检查约束

检查约束:检查某一列的值,是否是自己规定的值,如果不是将抛出异常

比如性别...

image-20231126155143179

 create table student_info (
     id bigint primary key auto_increment,
      student_name varchar(20) not null,
     age tinyint,
     gender set('男','女'),
     telphone varchar(11) unique,
     study_direction varchar(20)) engine=innodb character set = utf8mb4;
 或者:
 create table student_info (
     id bigint primary key auto_increment,
     studentname varchar (20) not nu11,
     age tinyint,
     gender enum('男','女'),
     telphone var char (11) unique,
     study_direction varchar(20)) engine=innodb character set = utf8mb4;

如果设置好了我们可以通过modify来修改检查约束

 ALTER TABLE stu_info MODIFY sex('男','女');

image-20231126160502368

默认值约束

image-20231126160600677

设计三范式

1.第一范式:确保每一列保持原子性(意思就是每一列和每一列的关系都是独立的)

2.第二范式:确保每行的唯一性(差不多箱单故意主键主表和外键外表的关系)

3.第三范式:确保每一列都和主键列直接相关,而不是间接相关

为什么不能将所有内容放在同一张表里面?

例如:下面这张图,为什么不能将所有列放在这一张表里面

image-20231127212312929

  • 如果我们想临时添加一门新课,此时这门课没有学生参加,没有学生的成绩等等...此时,我们又该如何应对

  • 如果我们要删除一门课程,怎么处理

  • 如果要删除一个学生的成绩信息怎么办,难道将这门课直接删掉吗

作业:

1.根据蜗牛学院实际情况,设计一个学生管理系统的数据库

2.熟练以后,设计一个图书销售系统的数据库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值