前言
✨欢迎来到小K的mysql专栏,本节将为大家带来MySQL约束的概念 | 非空约束 | 唯一约束 | 主键约束 | 自增长约束的分享✨
1. 约束(Constraint)概念
1.1 为什么需要约束
对于已经创建好的表,虽然字段的数据类型决定了所能存储的数据类型,但是表中所存储的数据是否合法并没有进行检查。在具体使用MySQL 软件时,如果想针对表中的数据做一些完整性检查操作,可以通过表的约束来完成。
数据完整性(Data Intergrity
)是指数据的精确性(A***uracy
)和可靠性(Reliability
)。他是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出来的。
为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制,主要从以下四个方面考虑:
- 实体完整性(Entity Integrity)如:同一张表中,不能存在两条完全相同无法区分的记录
- 域完整性(Domain Integrity)如:年龄范围0-120,性别范围 “男/女”
- 引用完整性(Referential Integrity)如:员工所在部门,必须要在部门表中存在
- 用户自定义完整性(User-defined Integrity)如:用户名唯一、密码不能为空等
1.2 什么是约束
约束是表级的强制规定。
可以在创建表时规定约束(通过``CREATE TABLE语句),或者在表创建之后通过
ALTER T ABLE`语句规定约束。
1.3 约束分类
1.3.1 根据约束的字段分类
- 单列约束
- 多列约束
1.3.2 根据约束的作用范围分类
- 列级约束
- 表级约束
区别
① 位置不同 :列级约束是写在列的后面,标记约束时写在所有字段的最后面
② 支持的约束类型不同:列级约束可以支持所有的约束类型,表级约束不能支持非空和默认
③ 列级约束不可以起约束名,表记约束可以起约束名(主键除外,主键使用的PRIMARY KEY)
1.3.3 根据约束的作用分类
完整性约束关键字 | 说明 |
---|---|
NOT NULL(NK) | 约束字段的值不能为空 |
DEFAULT | 设置字段的默认值 |
UNIQUE KEY(UK) | 约束字段的值是唯一(同一列不能出现相同的值) |
PRIMARAY KEY(PK) | 约束字段为表的主键,可以作为该表记录的唯一标识 |
AUTO_INCREMENT | 约束字段的值为自动增加 |
FOREIGN KEY(FK) | 约束字段为表的外键 |
CHECK() |
-
查看某个表已有的约束
SELECT * FROM information_schema.TABLE_CONSTRAINTS WHERE table_name='emp';
2. 非空约束(NK)
2.1 概念
当数据库表中的某个字段上的内容不希望设置为NULL时,则可以使用NK约束进行设置。即NK约束在创建数据库表时为某些字段加上“NOT NULL”约束条件,保证所有记录中该字段都有值。如果用户插入的记录中,该字段为空值,则数据库管理系统会报错。
2.2 特点
- 默认情况下,所有类型的值都可以是NULL
- 一个表可以有很多字段指定非空约束
- 空串" "不等于NULL,0也不等于NULL,NULL也不等于NULL
2.3 添加非空约束
- 创建表时
CREATE TABLE table_name(
字段名 数据类型 NOT NULL,
...
);
CREATE TABLE IF NOT EXISTS student
(
id INT NOT NULL,
name VARCHAR(10) NOT NULL,
score DECIMAL(4,1)
)
DESC student;
Tips1:如果我们现在执行下面这条语句将会报错(Field ‘name’ doesn’t have a default value)
,这是因为默认值为NULL
,而我们又指定了该字段不能为空
INSERT INTO student(id,score) VALUES(3,79.5);
- 创建之后添加
ALTER TABLE <表名> MODIFY 字段名 数据类型 约束;
Tips2:如果我们现在执行下面这条语句将会报错(Invalid use of NULL value),这是因为score
字段中现在已经有空值了
ALTER TABLE student MODIFY score DECIMAL(4,1) NOT NULL;
2.4 删除非空约束
ALTER TABLE 表名 MODIFY 字段名 数据类型 NULL;
#或
ALTER TABLE 表名 MODIFY 字段名 数据类型;
3. 唯一约束(UK)
3.1 概念
当数据库表中的某个字段上的内容不允许重复时,则可以使用UK约束进行设置。即UK约束在创建数据库表时为某些字段加上“UNIQUE”约束条件,保证所有记录中该字段上的值不重复。如果用户插入的记录中,该字段上的值与其他记录里该字段上的值重复,则数据库管理系统会报错。
3.2 特点
- 同一个表可以有多个唯一约束
- 唯一约束允许值为NULL
- 在创建唯一约束的时候,如果不给唯一约束命名,那么约束名就和字段名相同
3.3 添加唯一约束
- 创建表时添加
CREATE TABLE table_name(
字段名 数据类型 UNIQUE KEY,
...
);
- 创建表后添加
- 方法一
ALTER TABLE <表名> MODIFY 字段名 数据类型 UNIQUE;
- 方法二
ALTER TABLE <表名> ADD [CONSTRAINT 约束名] UNIQUE [KEY](字段名);
3.4 删除唯一约束
- 添加唯一约束的列上会自动创建唯一索引
- 删除唯一约束只能通过删除唯一索引的方式删除
- 删除时需要指定唯一索引名,唯一索引名和唯一约束名相同。
- 如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()中第一个列名相同。
ALTER TABLE <表名> DROP INDEX <索引名>;
4. 主键约束(PK)
4.1 概念
当想用数据库表中的某个字段来唯一标识所有记录时,则可以使用PK约束进行设置。即 PK约束在创建数据库表时为某些字段加上“PRIMARY KEY”约束条件,则该字段可以唯一地标示所有记录。
在数据库表中之所以设置主键,是为了便于数据库管理系统快速地查找到表中的记录。在具体设置主键约束时,必须要满足主键字段的值是唯一、非空的。由于主键可以是单一字段,也可以是多个字段,因此分为单字段主键和多字段主键。
4.2 特点
-
主键约束相当于 唯一约束+非空约束,意味着不允许重复和NULL值
-
主键约束对应着表中的一列或者多列(复合主键)
-
如果是多列组合的复合主键约束,那么这些列都不允许为NULL值,并且组合的值不允许重复
-
MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用
-
当创建主键约束时,系统默认会在所在的列或组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高),如果删除主键约束,主键约束对应的索引就自动删除了
-
需要注意一点的是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。
4.3 单字段主键
- 创建表时指定主键约束
CREATE TABLE table_name(
字段名 数据类型 PRIMARY KEY,
...
);
Tips:如果我们现在执行下面这条语句将会报错(Multiple primary key defined)
CREATE TABLE IF NOT EXISTS test2
(
empno INT PRIMARY KEY, # 列级约束
ename VARCHAR(10) PRIMARY KEY,
sal DECIMAL(7,1)
)
只允许有一个!!!
- ALTER TABLE添加主键约束
ALTER TABLE <表名> ADD PRIMARY KEY(字段名);
4.4 多字段主键(复合主键)
当主键有多个字段组合而成时,需要通过SQL语句CONSTRAINT
来实现,语法形式如下:
CREATE TABLE table_name(
字段名 数据类型,
...
[CONSTRAINT 约束名] PRIMARY KEY(字段1,字段2...)
);
在上述语句中,在字段定义完之后统一设置主键,PRIMARY KEY关键字括号中的字段可以有多个,需要通过逗号分割,用来实现设置多字段主键。
4.5 删除主键
ALTER TABLE <表名> DROP PRIMARY KEY;
5. 设置字段值自动增加(AUTO_INCREMENT)
5.1 概念
AUTO_INCREMENT是 MySQL 唯一扩展的完整性约束,当为数据库表中插入新记录时,字段上的值会自动生成唯一的ID。在具体设置AUTO_INCREMENT约束时,一个数据库表中只能有一个字段使用该约束,该字段的数据类型必须是整数类型。由于设置AUTO_INCREMENT约束后的字段会生成唯一的ID,所以该字段也经常会设置成PK主键。
5.2 特点
- 一个表最多只能有一个自增长列
- 当需要产生唯一标识符或者顺序值时,可设置自增长
- 自增长列约束的列必须是键列(主键列,唯一键列)
- 自增约束的列的数据类型必须是整数类型
- 如果自增列制定了0或NULL,会在当前最大值的基础上自增;如果自增列手动指定了具体值,直接付志伟具体值。
5.3 指定自增约束
- 方法一:创建表是指定
CREATE TABLE table_name(
字段名 数据类型 PRIMARY KEY|UNIQUE AUTO_INCREMENT,
...
);
- 方法二:通过ALTER TABLE添加
ALTER TABLE <表名> MODIFY 字段名 数据类型 AUTO_INCREMENT;
5.4 删除自增约束
ALTER TABLE <表名> MODIFY 字段名 数据类型;
TIPS:如下图,删除empno等于3的数据,再插入一条数据,empno不是3而是4
6. 总结赠书:Python深度学习“四大名著”之一全新PyTorch版
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
近年来,机器学习方法凭借其理解海量数据和自主决策的能力,已在医疗保健、 机器人、生物学、物理学、大众消费和互联网服务等行业得到了广泛的应用。
《Python机器学习:基于PyTorch和Scikit-Learn》这本书的定位是把机器学习理论和工程实践结合起来,从而降低读者的阅读门槛。从数据驱动方法的基础知识到最新的深度学习框架,本书每一章都提供了机器学习代码示例,用于解决实际应用中的机器学习问题。
这是一本全面介绍在PyTorch环境下学习机器学习和深度学习的综合指南,可以作为初学者的入门教程,也可以作为读者开发机器学习项目时的参考书。
深入介绍了机器学习方法的基础知识,不仅提供了构建机器学习模型的说明,而且提供了构建机器学习模型和解决实际问题的基本准则。无论是机器学习入门新手,还是计划跟踪机器学习进展的研发人员,都可以将本书作为使用Python进行机器学习的不二之选。
感兴趣的小伙伴可以自行阅读购买
当当网购买链接:Python深度学习“四大名著”之一全新PyTorch版
✨✨本次送书两本,评论区抽两位小伙伴送书✨✨
活动时间:截止到2023-07-22 20:00:00
抽奖方式:利用程序进行抽奖。
参与方式:关注博主、点赞、收藏,评论区发布高质量评论(单账号最多评论三次)
中奖名单:
溜达的大象
杭电码农-NEO