为防止不符合规范的数据存入数据库,在用户对数据进行插入、修改、删除等操作时,
MySQL
提供了一种机制来检查数据库中的数据是否满足规定的条件,以保证数据库中数据的准确性和一致性,这种机制就是完整性约束。
MySQL
中主要支持以下几种完整性约束,如表所示。 其中
Check
约束是
MySQL8
中提供的支持。
1.完整性约束分类
约束条件约束描述
PRIMARY KEY
主键约束,约束字段的值可唯一地标识对应的记录
NOT NULL
非空约束,约束字段的值不能为空
UNIQUE
唯一约束,约束字段的值是唯一的
CHECK
检查约束,限制某个字段的取值范围
DEFAULT
默认值约束,约束字段的默认值
AUTO_INCREMENT
自动增加约束,约束字段的值自动递增
FOREIGN KEY
外键约束,约束表与表之间的关系
PRIMARYKEY##主键约束,约束字段的值可唯一地标识对应的记录NOTNULL##非空约束,约束字段的值不能为空UNIQUE##唯一约束,约束字段的值是唯一的CHECK##检查约束,限制某个字段的取值范围DEFAULT##默认值约束,约束字段的默认值AUTO_INCREMENT##自动增加约束,约束字段的值自动递增FOREIGNKEY##外键约束,约束表与表之间的关系
1.主键约束
主键约束(
PRIMARY KEY
,缩写
PK
),是数据库中最重要的一种约束,其作用是约束表中的某个字段可以唯一标识一条记录。因此,使用主键约束可以快速查找表中的记录。
身份证、学生的学号等等,设置为主键的字段取值不能重复(唯一),也不能为空(非空),否则无法唯一标识一条记录。
主键可以是单个字段,也可以是多个字段组合。对于单字段主键的添加可使用表级约束,也可以使用列级约束;而对于多字段主键的添加只能使用表级约束。
2.非空约束
非空约束(
NOT NULL
,缩写NK)规定了一张表中指定的某个字段的值不能为空(
NULL
)。设置了非空约束的字段,在插入的数据为
NULL
时,数据库会提示错误,导致数据无法插入。
无论是单个字段还是多个字段非空约束的添加只能使用列级约束(非空约束无表级约束)
为已存在表中的字段添加非空约束
altertable student8 modify stu_sex varchar(1)notnull;
使用ALTER TABLE语句删除非空约束
altertable student8 modify stu_sex varchar(1)null;
3. 唯一约束
唯一约束(
UNIQUE
,缩写
UK
)比较简单,它规定了一张表中指定的某个字段的值不能重复,即这一字段的每个值都是唯一的。如果想要某个字段的值不重复,那么就可以为该字段添加为唯一约束。
无论单个字段还是多个字段唯一约束的添加均可使用列级约束和表级约束
4. 检查约束
检查约束(
CHECK
)用来限制某个字段的取值范围,可以定义为列级约束,也可以定义为表级约束。
MySQL8
开始支持检查约束。
5. 默认值约束
默认值约束(
DEFAULT
)用来规定字段的默认值。如果某个被设置为
DEFAULT
约束的字段没插入具体值,那么该字段的值将会被默认值填充。
默认值约束的设置与非空约束一样,也只能使用列级约束。
6. 字段值自动增加约束
自增约束(
AUTO_INCREMEN
T)可以使表中某个字段的值自动增加。一张表中只能有一个自增长字段,并且该字段必须定义了约束(该约束可以是主键约束、唯一约束以及外键约束),如果自增字段没有定义约束,数据库则会提示
“Incorrect table definition; there can be only one auto column and it must be defined as a key”
错误。
由于自增约束会自动生成唯一的
ID
,所以自增约束通常会配合主键使用,并且只适用于整数类型。一般情况下,设置为自增约束字段的值会从1开始,每增加一条记录,该字段的值加
1
。
为已存在表中的字段添加自增约束
/*创建表student11*/createtable student11 (
stu_id int(10)primarykey,
stu_name varchar(3),
stu_sex varchar(1));/*为student11表中的主键字段添加自增约束*/altertable student11 modify stu_id int(10)auto_increment;
使用ALTER TABLE语句删除自增约束
altertable studen11 modify stu_id int(10);
2.列级完整性约束
## 非外键约束-- 列级完整性约束CREATETABLE t_student(/*
PRIMARY
主键约束,约束字段的值可唯一地标识对应的记录 AUTO_INCREMENT自动增加约束,约束字段的值自动递增 */
son INT(10)PRIMARYKEYauto_increment,-- 1.学号是主键 2.如果学号是主键,那么需要自增/*
NOT NULL
非空约束,约束字段的值不能为空*/
sname VARCHAR(10)NOTNULL,-- 姓名不能为空/*
DEFAULT
-默认值约束,约束字段的默认值
CHECK
检查约束,限制某个字段的取值范围*/
sex CHAR(1)DEFAULT'男'CHECK(sex='男'|| sex='女'),-- 性别默认值为男/*CHECK
检查约束,限制某个字段的取值*/
age INT(3)CHECK(age>=18and age<=50),-- 年龄限只能在18-540岁之间
enterdate date,
classname VARCHAR(10),/*
UNIQUE
唯一约束,约束字段的值是唯一的*/
emile VARCHAR(18)UNIQUE-- Emily唯一的);-- cselect 查询SELECT*FROM t_student;# 添加新数据 检查完整性约束INSERTINTO t_student
VALUES(1,'李四','男',22,now(),'中文1班','[email protected]');INSERTINTO t_student
VALUES(2,'李四','男',22,now(),'中文1班','[email protected]');INSERTINTO t_student(sname,age)VALUES('菲菲',22);-- son 自增-- 删除数据DELETEFROM t_student
WHERE son=1;-- 修改数据UPDATE t_student
SET enterdate='2022-5-25',classname='python2班',emile='12356@qq'WHERE son =3;
3.表级完整性约束
## 表级完整性约束条件 constranint 约束CREATETABLE t_student1(
son INT(6),
sname VARCHAR(5)NOTNULL,
sex CHAR(1)DEFAULT'男',
age INT(3),
enterdate date,
classname VARCHAR(10),
emile VARCHAR(18)/*在创建表时添加约束
CONSTRAINT pk_stu PRIMARY KEY (son), -- 表级完整性主键约束 pk_stu约束的名字
CONSTRAINT ck_stu_sex CHECK (sex='男' || sex='女'),
CONSTRAINT ck_stu_age CHECK (age>=18 and age<=50),
CONSTRAINT un_stu_emile UNIQUE (emile)
);*//*> 1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key时间: 0.001s*/-- 错误的解决办法 就是把 AUTO_INCREMENT 自增去掉-- 在创建表以后添加约束ALTERTABLE t_student1 ADDCONSTRAINT pk_stu PRIMARYKEY(son);-- 主键约束ALTERTABLE t_student1 MODIFY son INT(6)auto_increment;-- 修改自增条件ALTERtable t_student1 addCONSTRAINT uq_stu_emile UNIQUE(emile);-- 添加数据INSERTINTO t_student1 VALUES(1,'阿伟','男',18,NOW(),'软件一班','[email protected]');-- 查看表结构desc t_student1;-- 查看数据SELECT*FROM t_student1;-- 删除表DROPtable t_student1;
版权归原作者 北极的三哈 所有, 如有侵权,请联系我们删除。