1. 约束(constraint)概述
1.1 为什么需要约束
数据完整性(Data Integrity)是指数据的 精确性 (Accuracy)和 可靠性 (Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息而提出的。 为了保证数据的完整性,SQL 规范以约束的方式对 表数据进行额外的条件限制 。从以下四个方面考虑:
实体完整性( Entity Integrity ) :例如,同一个表中,不能存在两条完全相同无法区分的记录
域完整性( Domain Integrity ) :例如:年龄范围 0-120 ,性别范围 “ 男 / 女 ”
引用完整性( Referential Integrity ) :例如:员工所在部门,在部门表中要能找到这个部门
用户自定义完整性( User - defined Integrity ) :例如:用户名唯一、密码不能为空等,本部门经理的工资不得高于本部门职工的平均工资的5 倍。
1.2 什么是约束
约束是表级的 强制规定 。
可以在 创建表时规定约束(通过 CREATE TABLE 语句) ,或者在 表创建之后通过 ALTER TABLE 语句规定 约束 。
1.3 约束的分类
根据约束数据列的限制,约束可分为:
单列约束:每个约束只约束一列
多列约束:每个约束可约束多列数据
根据约束的作用范围,约束可分为:
列级约束:只能作用在一个列上,跟在列的定义后面
表级约束:可以作用在多个列上,不与列一起,而是单独定义
位置 支持的约束类型 是否可以起约束名
列级约束: 列的后面 语法都支持,但外键没有效果 不可以
表级约束: 所有列的下面 默认和非空不支持,其他支持 可以(主键没有效果)
根据约束起的作用,约束可分为:
NOT NULL 非空约束,规定某个字段不能为空
UNIQUE 唯一约束,规定某个字段在整个表中是唯一的
PRIMARY KEY 主键(非空且唯一)约束
FOREIGN KEY 外键约束
CHECK 检查约束
DEFAULT 默认值约束
注意:MySQL不支持check约束,但可以使用check约束,而没有任何效果
查看某个表已有的约束
#information_schema数据库名(系统库) #table_constraints表名称(专门存储各个表的约束) SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';
SELECT * FROM information_schema.table_constraints WHERE table_name = 'employees';
2. 非空约束
2.1 作用
限定某个字段 / 某列的值不允许为空
2.2 关键字
NOT NULL
2.3 特点
默认,所有的类型的值都可以是NULL,包括INT、
FLOAT等数据类型
非空约束只能出现在表对象的列上,只能某个列单独限定非空,不能组合非空
一个表可以有很多列都分别限定了非空
空字符串''不等于NULL,0也不等于NULL
2.4 添加非空约束
(1)建表时
CREATE TABLE 表名称( 字段名 数据类型, 字段名 数据类型 NOT NULL, 字段名 数据类型 NOT NULL );
(2)建表后
alter table 表名称 modify 字段名 数据类型 not null;
2.5 删除非空约束
alter table 表名称 modify 字段名 数据类型 NULL;#去掉not null,相当于修改某个非注解字段, 该字段允许为空 或 alter table 表名称 modify 字段名 数据类型;#去掉not null,相当于修改某个非注解字段, 该字段允许为空