数据库的增删改查(二)

1、数据库约束

关系型数据库的一个重要功能

主要作用是保证数据的完整性,也就是数据的正确性(数据本身是正确的,关联关系也是正确的)

人工检查数据的完整性的工作量非常的大,在数据表定义一些约束,那数据库在写入数据时,帮我们完成这个工作

1.1、约束类型

*NOT NULL -指示某列不能存储NULL值

*UNIQUE -保证某列的每行必须由唯一的值

*DEFAULT -规定没有给列赋值时的默认值

*PRIMARY KEY - NOT NULL和UNIQUE的结合。确保某列(或两个列多个列的结合)唯一的标识,有助于更容易更快速的找到表中的一个特定的记录

*FOREING KEY - 保证一个表中的数据匹配到另一个表中的值的参照完整性

*CHECK - 保证每列的值都符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句

1.2、NULL 约束

*创建表时可以指定某列不能为空

-- 重新设置学生表结构

DROP TABLE IF EXISTS student;
CREATE TABLE student (
             id INT NOT NULL,
             sn INT,
             name VARCHAR(20),
             qq_mail VARCHAR(20)
);

 

 1.3、UNIQUE:唯一约束

保证某列的每一行必须有唯一的值(某一列的值不能重复)

-- 重新设置表结构

DROP TABLE IF EXISTS student;

create table student(

                  id int NOT NULL,

                  sn int UNIQUE,

                  name VARCHAR(20),

                  qq_mail VARCHAR(20)

);

 1.4、DEFAULT:默认值约束

*规定没有给列赋值时的默认值

-- 重新设置表结构

DROP TABLE IF EXISTS student;

create table student(

                  id int NOT NULL,

                  sn int UNIQUE,

                  name VARCHAR(20) DEFAULT '无名氏',

                  qq_mail VARCHAR(20)

);

 1.5、PRIMARY KEY:主键约束

主键帮我们做了两个检验,一个是非空,一个是唯一校验

*指定id列为主键:

-- 重新设置表结构

DROP TABLE IF EXISTS student;

create table student(

                  id int NOT NULL PRIMARY KEY,

                  sn int UNIQUE,

                  name VARCHAR(20),

                  qq_mail VARCHAR(20)

);

 

 对于整型类型的主键,常搭配auto_increament来使用。插入数据对应字段不给值时,使用最大值+1。

-- 主键是NOT NULL和UNIQUE的结合,可以不使用NOT NULL

id INT PRIMARY KEY auto_increament;

注:

*一个表中不允许有两个主键存在

*一个主键可以包括两个主键(复合主键)

1.6、FOREING KEY:外键约束 

表中某个列的值,必须是另一张表中的主键列或是唯一约束列的值,也就是当前表中的值必须在另一张表中存在,且满足主键或唯一约束

外键用于关联其他表的主键或唯一键,语法:

foreign key (字段名) references 主表(列)

 示例:

*创建班级表classes,id为主键

-- 创建班级表,有使用MySQL关键字作为字段时,需要使用··来标识

drop table id exists classesl;

 create table classes (

                id int PRIMARY KEY auto_increment,

                name varchar(20),

               `desc` VARCHAR(100)

);

*创建学生表,一个学生对应一个班级,一个班级对应多个学生,使用id作为主键,classes_id为外键,关联班级表id

-- 重置学生表结构

drop table if exists student;

create Table student(

                id int primary key auto_increment,

                sn int UNIQUE,name varchar(20) default '无名氏',

                qq_mail varchar(20),

                classes_id int,

                foreign key(classes_id) references classes(id)

);

2、表的设计

*需要从需求中获取类,类对应的是数据库中的实体,实体在数据库中的表现就是一张一张表,类中的属性就对应数据表中的字段

*根据实体编写SQL语句,DDL,创建具体的数据库,数据表

*设计表的时候会遵循一些范式,一般常说的有三大范式

*分类:第一范式1NF,第二范式2NF,第三范式3NF,BC范式BCNF

2.1、第一范式(一对一)

关系型数据库的最基本要求,不满足第一范式就不可以称为数据库

2.2、第二范式(一对多)

在满足第一范式的基础上,不存在非关键字段对任意候选字段的部分函数依赖(存在复合主键的情况下)

 不满足第二范式可能会出现的问题

*数据冗余: 学分和学生的姓名年龄都出现了,造成了大量的数据冗余。

*更新异常:如果要调整MySQL的学分,那么就需要更新所有的记录中关于MySQL的条目,如果一旦某些记录更新成功,某些更新失败,那么就会造成同一门课程出现不同分数的情况,数据不一致

*插入异常:每一门课都与学生都有对应的关系,只有同学选修并且通过考试获得了成绩,才可能生成一条记录,也就是一门新课程没有同学出成绩之前是无法写入数据的。

*删除异常:把毕业的同学考试成绩都删除了,删除记录的同时,课程和学分的信息也会被一块删除,导致一段时间内是没有课程和学分的数据信息。

2.3、第三范式(多对多)

 在第二范式的基础上,不存在非关键字段,对任意候选键(可以理解为主键,外键)的传递依赖

 

 满足第三范式对于插入,更新,删除来说都是比较友好的,但是查询效率明显降低

比如说,要查询同学在那个学院,首先要查出来学生记录,再通过学生记录中的学员编号,再去数据库中查询学院信息

*创建课程表

-- 创建课程表
DROP TABLE IF EXISTS course;
CREATE TABLE course (
                   id INT PRIMARY KEY auto_increment,
                   name VARCHAR(20)
);

 *创建学生课程中间表,考试成绩表

DROP TABLE IF EXISTS score;
CREATE TABLE score (
                  id INT PRIMARY KEY auto_increment,
                  score DECIMAL(3, 1),
                  student_id int,
                  course_id int,
                  FOREIGN KEY (student_id) REFERENCES student(id),
                  FOREIGN KEY (course_id) REFERENCES course(id)
);

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值