10、约束
10.1、为什么要约束
在实际的数据库操作中,关于表中的数据,如若不做约束可能存在以下问题:
①id 列一般是用标示数据的唯一性的,不约束可能出现多个id重复
②存储用户年龄的数据的age列的数据可能出现四位数五位数,而人并没有这么长寿,如此有违常理
③成绩是负数,而一般情况来说成绩很少出现负数
④成绩值为null,而成绩即使没考也应该是0分
10.2、概念
针对上述数据问题,我们就可以从数据库层面在添加数据的时候进行限制,这就是约束。
10.3、约束的分类
10.3.1、非空约束
非空约束: 关键字是 NOT NULL
保证列中所有的数据不能有null值。
Ex:create table user(name varchar(10) not null);
编辑
可以看到,进行非空约束之后,再传入null,会报错。
10.3.2、唯一约束
唯一约束:关键字是 UNIQUE
保证列中所有数据各不相同。 (unique唯一)
create table user(name varchar(10),unique(name));
10.3.3、主键约束⭐
主键约束: 关键字是 PRIMARY KEY
主键是一行数据的唯一标识,要求非空且唯一。一般我们都会给每张表添加一个主键列用来唯一标识数据。
例如:id就可以作为主键,来标识每条数据。那么这样就要求数据中id的值不能重复,不能为null值。
create table user(id int,name varchar(10),primary key(id));
10.3.4、检查约束⭐⭐
检查约束: 关键字是 CHECK
保证列中的值满足某一条件。
例如:我们可以给age列添加一个范围,最低年龄可以设置为1,最大年龄就可以设置为300,这样的数据才更合理些。
SQL->create table user(age int check(age>18 and age<80));
注意:MySQL不支持检查约束。
解决办法:从数据库层面不能保证,以后可以在java代码中进行限制,一样也可以实现要求。
10.3.5、默认约束
默认约束: 关键字是 DEFAULT
保存数据时,未指定值则采用默认值。
例如:我们在给english列添加该约束,指定默认值是0,这样在添加数据时没有指定具体值时就会采用默认给定的0。
create table user(english int default 0);
10.3.6、外键约束
外键约束: 关键字是 FOREIGN KEY
外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性。
比如orders表中的userId必须参考user表中的id,如果插入的userId在user表中不存在,则无法插入
编辑
SQL->create table orders(id int primary key,userId int,foreign key(userId) references user(id));
10.3.7、unique和primary key的区别⭐
unique和primary key约束都可以为一列值的唯一性提供保障,但是unique在同一个表中可以出现多次,而primary key在同个表中只能出现一次
11、数据库设计
11.1、简介
11.1.1、软件的研发步骤:
编辑
11.1.2、数据库设计概念
数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型,建立数据库中的表结构以及表与表之间的关联关系的过程。
11.1.3、数据库设计的步骤
①需求分析(数据是什么? 数据具有哪些属性? 数据与属性的特点是什么)
②逻辑分析(通过ER图对数据库进行逻辑建模,不需要考虑我们所选用的数据库管理系统)
③物理设计(根据数据库自身的特点把逻辑设计转换为物理设计)
④维护设计(1.对新的需求进行建表;2.表优化)
如下图就是ER(Entity/Relation)图:
编辑
11.2、表关系
表关系有三种:一对一、一对多、多对多
11.2.1、一对一
如:用户和用户详情
一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能
实现方式:在任意一方加入外键,关联另一方主键,并且设置外键为唯一(UNIQUE)
11.2.2、一对多
如:部门和员工
一个公司有多个部门,一个部门有多个员工,则部门表对应员工表
一个部门对应多个员工,一个员工对应一个部门
实现方式:在多的一方建立外键,指向一的一方的主键
编辑
编辑
例如:CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES tb_dept(id)
11.2.3、多对多
如:商品和订单
一个商品对应多个订单,一个订单包含多个商品
实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
编辑
12、多表查询
多表查询:从多张表中一次性的查询出我们想要的数据
12.1、内连接查询
内连接相当于查询A和B的交集数据
编辑
-- 隐式内连接
SELECT 字段列表 FROM 表1,表2… WHERE 条件;
-- 显示内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;
12.2、外连接查询
左外连接:相当于查询A表所有数据和交集部分数据
右外连接:相当于查询B表所有数据和交集部分数据
编辑
-- 左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
-- 右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
12.3、子查询
概念:查询中嵌套查询,称嵌套查询为子查询。
编辑
13、事务
数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令。
事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败。
事务是一个不可分割的工作逻辑单元
13.1、如何理解
一个事务就是一块命令,比如转账操作,数据在更新的时候有先后。
比如A向B转钱的过程中程序刚好出现了错误,那么有可能出现A的余额变少了但是B的余额并没有增加的情况,此时就需要事务来解决这个问题。
把转账这个操作看成一个整体,如果出了异常,便回滚事务,即A转账出错时,A的资金余额回到转账前
13.2、语法
①开启事务->START TRANSACTION; 或者 BEGIN;
②提交事务->commit;
③回滚事务->rollback;
Ex:
begin;
一系列操作
commit;
rollback;
⭐在开发中一般不这样操作,而是在java中进行操作,在java中可以抓取异常,没出现异常提交事务,出现异常回滚事务。
13.3、四大特征
事务的四大特征:
①原子性(Atomicity) : 事务是不可分割的最小操作单位,要么同时成功,要么同时失败
②一致性(Consistency) :事务完成时,必须使所有的数据都保持一致状态
③隔离性(Isolation) : 多个事务之间,操作的可见性
④持久性(Durability) : 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
编辑