MySQL基础_10.约束

第一章、约束

  约束是表级的强制规定。可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后通过 ALTER TABLE 语句规定约束。
 
约束的分类:

  1. 约束数据列的限制
    单列约束:每个约束只约束一列。
    多列约束:每个约束可约束多列数据。
  2. 约束的作用范围
    列级约束:只能作用在一个列上,跟在列的定义后面。
    表级约束:可以作用在多个列上,不与列一起,而是单独定义。

1.1 非空约束

1.作用

NOT NULL:限定某个字段/列的值不为空

2.特点

  • 所有类型的值都可以为NULL,包括INTFLOAT等数据类型
  • 非空约束只能出现在表对象的列上,只能某个列单独限制为非空,不能组合非空
  • ‘’空字符串不等同于NULL,0也不是NULL

3.sql语句举例

CREATE TABLE 表名称(
 字段名 数据类型,
 字段名 数据类型 NOT NULL, 
 字段名 数据类型 NOT NULL
);

alter table 表名称 modify 字段名 数据类型 not null;

1.2 唯一性约束

1.作用

UNIQUE:限制某个字段/列的值不能重复,允许出现多个空值:NULL

2.特点

  • 同一个表可以有多个唯一约束
  • 唯一约束可以是某个列的值唯一,也可以是多个列组合的值唯一
  • 唯一性约束允许列值为空
  • 在创建唯一约束的时候,如果没有给唯一约束命名,则默认和列名相同
  • MySQL会给唯一约束的列上默认创建一个唯一索引

3.举例

create table 表名称(
 字段名 数据类型,
 字段名 数据类型  unique, 
 字段名 数据类型  unique key,
 字段名 数据类型
);
create table 表名称(
 字段名 数据类型,
 字段名 数据类型, 
 字段名 数据类型,
 [constraint 约束名] unique key(字段名)
);

1.3 主键约束

1.作用

PRIMARY KEY:用来唯一标识表中的一行记录

2.特点

  • 主键约束相当于唯一约束和非空约束的组合,主键约束列不允许重复,也不允许出现空值
  • 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可在表级别上创建
  • 主键约束对应着表中的一列或多列(复合主键)
  • 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复
  • 当创建主键约束时,系统默认会在所在列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。
  • 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。

1.4 自增列

1.作用

AUTO_INCREMENT:某个字段的值自增。

2.特点和要求

  • 一个表最多只能有一个自增列
  • 当需要产生唯一标志或顺序值时,可设置自增长
  • 自增长列约束的列必须是键列(主键或唯一键列)
  • 自增约束的列的数据类型必须是整数类型

3.新特性

CREATE TABLE test(
 id INT PRIMARY KEY AUTO_INCREMENT
);

INSERT INTO test(id)
VALUES(0),(0),(0);

DELETE FROM test WHERE id = 2;

SELECT * FROM test;

INSERT INTO test(id) VALUES(0);

在这里插入图片描述

此时再将id=3的记录删除,重启服务器,在MySQL5.7版本中再新增数据,id将从2开始,而MySQL8.0版本将从4开始。

  • 在MySQL5.7系统中,对于自增主键的分配规则,是由InnoDB数据字典内部一个计数器来决定的,而该计数器只在内存中维护,并不会持久化到磁盘中。当数据库重启时,该计数器会被初始化。
  • MySQL8.0将自增主键的计数器持久化到重做日志中。每次计数器发生变化,都会将其写入到重做日志中,如果数据库重启,InnoDB会根据日志中的信息来初始化计数器的内存值。

1.6 外键约束

1.作用

FOREIGN KEY:限定某个表的某个字段的引用完整性。
比如:员工表的员工所在部门的选择,必须在部门表能找到对应部分。
在这里插入图片描述

2.特点

  • 从表的外键列,必须引用/参考主表的主键列或唯一约束列,因为被依赖/参考的值必须是唯一的
  • 在从表中指定外键约束,并且一个表可以建立多个外键约束
  • 从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义必须一致
  • 当创建外键约束时,系统默认会在所在列上建立对应的普通索引(根据外键查询效率很高)

3.注意事项

  在MysQL里,外键约束是有成本的,需要消耗系统资源。对强大并发的SQL操作,有可能会不适合。比如大型网站的中央数据库,可能会因为外键约束的系统开销而变得非常慢。所以,MySQL允许你不使用系统自带的外键约束,在应用层面完成检查数据一致性的逻辑。也就是说,即使你不用外键约束,也要想办法通过应用层面的附加逻辑,来实现外键约束的功能,确保数据的一致性。

4.阿里开发规范

【强制】不得使用外键与级联,一切外键概念必须在应用层解决。

说明:(概念解释)学生表中的student_id是主键,那么成绩表中的student_id则为外键。如果更新学生表中的studrnt_id,同时触发成绩表中的student_id更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群﹔级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

1.7 CHECK约束

1.作用

CHECK:检查某个字段的值是否符合xx要求,一般指的是值的范围(比如salary > 2000 )。

2.说明

  MySQL5.7 可以使用check约束,但是check约束对数据验证没有任何作用。添加数据时,没有任何错误或警告,但是MySQL8.0 可以使用check约束。

1.8 DEFAULT约束

1.作用

DEFAULT:给某个字段/列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值

2.面试题

(1)为什么建表时,加not null default''default 0?
答:不想让表中出现null值。

  • 不好比较,null是一种特殊值,比较时只能用专门的is null和is not null来比较。碰到运算符,通常返回null;
  • 效率不高。影响提高索引效果;

(2)带AUTO_INCREMENT约束的字段值是从1开始的吗?
答:在MySQL中,默认AUTO_INCREMENT的初始值是1,每新增一条记录,字段值自动加1。设置自增属性(AUTO_INCREMENT)的时候,还可以指定第一条插入记录的自增字段的值,这样新插入的记录的自增字段值从初始值开始递增,如在表中插入第一条记录,同时指定id值为5,则以后插入的记录的id值就会从6开始往上增加。添加主键约束时,往往需要设置字段自动增加属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值