文章目录
- 第一章、约束
- 1.1 约束的定义
- 1.2 非空约束
- 1.3 唯一性约束
- 1.4 主键约束
- 1.5 自增列
- 1.6 外键约束
- 1.7 CHECK约束
- 1.8 DEFAULT约束
第一章、约束
1.1 约束的定义
约束是对表中字段的限制。
约束按照作用范围可以分为:列级约束和表级约束
列级约束:声明在对应字段的后面
表级约束:在表中所有字段都声明完,在所有字段的后面声明
1.2 非空约束
1.作用
限定某个字段/列的值不为空
2.关键字
NOT NULL
3.特点
- 所有类型的值都可以为
NULL
,包括INT
,FLOAT
等数据类型 - 非空约束只能出现在表对象的列上,只能某个列单独限制为非空,不能组合非空
‘’
空字符串不等同于NULL
,0也不是NULL
1.3 唯一性约束
1.作用
限制某个字段/列的值不能重复,允许出现多个空值:NULL
2.关键字
UNIQUE
3.特点
- 同一个表可以有多个唯一约束
- 唯一约束可以是某个列的值唯一,也可以是多个列组合的值唯一
- 唯一性约束允许列值为空
- 在创建唯一约束的时候,如果没有给唯一约束命名,则默认和列名相同
MySQL会给唯一约束的列上默认创建一个唯一索引
4.举例
CREATE TABLE user(
id INT,
user_name VARCHAR(15),
user_password VARCHAR(25),
// 表级约束,复合的唯一索引
CONSTRAINT uk_user_name_password UNIQUE(user_name,user_password)
)
1.4 主键约束
1.作用
用来唯一标识表中的一行记录
2.关键字
PRIMARY KEY
3.特点
- 主键约束相当于
唯一约束和非空约束的组合
,主键约束列不允许重复,也不允许出现空值 一个表最多只能有一个主键约束
,建立主键约束可以在列级别创建,也可在表级别上创建- 主键约束对应着表中的一列或多列(复合主键)
- 如果是多列组合的复合主键约束,
那么这些列都不允许为空值
,并且组合的值不允许重复 - 当创建主键约束时,
系统默认会在所在列或列组合上建立对应的主键索引
(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。 - 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。
1.5 自增列
1.作用
某个字段的值自增
2.关键字
AUTO_INCREMENT
3.特点和要求
一个表最多只能有一个自增列
- 当需要产生唯一标志或顺序值时,可设置自增长
- 自增长列约束的列必须是键列(主键或唯一键列)
- 自增约束的列的数据类型必须是整数类型
4.新特性
CREATE TABLE test(
id INT PRIMARY KEY AUTO_INCREMENT
);
INSERT INTO test(id)
VALUES(0),(0);
SELECT * FROM test;
DELETE FROM test WHERE id = 2;
INSERT INTO test(id)
VALUES(0);
此时再将id=3
的记录删除,重启服务器,在MySQL5.7版本中再新增数据,id将从2开始,而MySQL8.0版本将从4开始。
- 在MySQL5.7系统中,对于自增主键的分配规则,是由InnoDB数据字典内部一个计数器来决定的,而该计数器只在内存中维护,并不会持久化到磁盘中。当数据库重启时,该计数器会被初始化。
- MySQL8.0将自增主键的计数器持久化到重做日志中。每次计数器发生变化,都会将其写入到重做日志中,如果数据库重启,InnoDB会根据日志中的信息来初始化计数器的内存值。
1.6 外键约束
1.作用
限定某个表的某个字段的引用完整性。
比如:员工表的员工所在部门的选择,必须在部门表能找到对应部分。
2.关键字
FOREIGN KEY
3 .主表和从表/父表和子表
主表(父表)︰被引用的表,被参考的表
从表(子表)︰引用别人的表,参考别人的表
4.特点
- 从表的外键列,必须引用/参考主表的
主键列或唯一约束列
,因为被依赖/参考的值必须是唯一的 - 在从表中指定外键约束,并且一个表可以建立多个外键约束
- 从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义必须一致
- 当创建外键约束时,
系统默认会在所在列上建立对应的普通索引
(根据外键查询效率很高)
5.使用示例
create table 主表名称(
字段1 数据类型 primary key,
字段2 数据类型
);
create table 从表名称(
字段1 数据类型 primary key,
字段2 数据类型,
CONSTRAINT 外键约束名 FOREIGN KEY(从表的某个字段) references 主表名(被参考字段)
);
6.注意事项
在MysQL里,外键约束是有成本的,需要消耗系统资源。对强大并发的SQL操作,有可能会不适合。比如大型网站的中央数据库,可能会因为外键约束的系统开销而变得非常慢
。所以,MySQL允许你不使用系统自带的外键约束,在应用层面完成检查数据一致性的逻辑
。也就是说,即使你不用外键约束,也要想办法通过应用层面的附加逻辑,来实现外键约束的功能,确保数据的一致性。
7.阿里开发规范
【强制】不得使用外键与级联
,一切外键概念必须在应用层解决。
说明:(概念解释)学生表中的student_id是主键,那么成绩表中的student_id则为外键。如果更新学生表中的studrnt_id,同时触发成绩表中的student_id更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群﹔级联更新是强阻塞,存在数据库更新风暴
的风险;外键影响数据库的插入速度。
1.7 CHECK约束
1.作用
检查某个字段的值是否符合xx要求,一般指的是值的范围(比如salary > 2000 )。
2.关键字
CHECK
3.说明
MySQL5.7 可以使用check约束,但是check约束对数据验证没有任何作用。添加数据时,没有任何错误或警告,但是MySQL8.0 可以使用check约束。
1.8 DEFAULT约束
1.作用
给某个字段/列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。
2.关键字
DEFAULT
3.说明
为什么建表时,加not null default''
或 default 0
?
答:不想让表中出现null值。
- 不好比较,null是一种特殊值,比较时只能用专门的is null和is not null来比较。碰到运算符,通常返回null;
- 效率不高。影响提高索引效果;