一、数据库约束的概述
1、约束的作用
对表中的数据进行限制,保证数据的正确性、有效性和完整性。
一个表如果添加了约束,不正确的数据将无法插入到表中。约束在创建表的时候添加比较合适。
2、约束的种类
约束名 | 约束关键字 |
主键约束 | primary key |
唯一约束 | unique |
非空约束 | not null |
外键约束 | foreign key |
检查约束 | check 注:MySQL不支持 |
二、主键约束
1、主键的作用
主键的作用:用来唯一标识数据库中的每一条记录。
2、哪些字段应该作为表的主键
通常不用业务字段作为主键,单独给每张表设计一个 id 的字段,把 id 作为主键。
主键就是给数据库和程序使用的,不是给最终的客户使用的,所以主键有没有含义没有关系,只有不重复,非空就行。
3、创建主键
-
- 主键关键字:primary key
- 主键的特点: ① 非空 not null; ② 唯一
- 基本语法
① 在创建表时,添加主键约束
create table student(
id int primary key,-- 给id添加主键约束
name varchar(20)
);
② 删除主键
ALTER TABLE student DROP PRIMARY KEY;
③ 创建完表后,添加主键(两种方式)
ALTER TABLE student MODIFY id int PRIMARY KEY;
ALTER TABLE student add primary key(字段名);
注意:
① 主键非空且唯一
② 一张表只能有一个字段(组)作为主键
③ 主键就是表中记录的唯一标识
4、主键自增
主键如果让自己添加很有可能重复,所以希望在每次插入新记录时,数据库自动生成主键字段的值。
基本语法格式:
① 创建表时,添加主键约束,并且完成主键自增长(字段类型必须是整数类型)
create table student(
id int primary key auto_increment,-- 给id添加主键约束
name varchar(20)
);
② 删除自动增长
ALTER TABLE stu MODIFY id INT;
③ 创建表完后,添加自动增长
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
5、修改自增长的默认值起始值
默认 auto_increment 的开始值是 1,如果希望修改起始值,使用下面语法。
① 创建时指定起始值
CREATE TABLE 表名(
列名 int primary key AUTO_INCREMENT
) AUTO_INCREMENT=起始值;
② 创建好以后修改起始值
ALTER TABLE 表名 AUTO_INCREMENT=起始值;
6、delete 和 truncate 对自增长的影响
-
- delete:删除所有记录之后,自增长没有影响。
- truncate:删除以后,自增长又重新开始。
三、唯一约束
1、概念
唯一约束概念:表中的某一列不能出现重复的值,必须保证值的唯一性。
2、基本语法格式
① 创建表时,添加唯一约束
CREATE TABLE student(
id INT,
phone_number VARCHAR(20) UNIQUE -- 添加了唯一约束
);
注意:在MySQL中,唯一约束限定的列的值可以有多个 null。(null表示不确定,即不相等)
② 删除唯一约束
ALTER TABLE student DROP INDEX phone_number;
③ 在创建表后,添加唯一约束
ALTER TABLE student MODIFY phone_number VARCHAR(20) UNIQUE;
四、非空约束
1、非空约束概念
非空约束:即数据表的某一列不能为 null。
2、基本语法格式
① 创建表时添加约束
CREATE TABLE student(
id INT,
NAME VARCHAR(20) NOT NULL -- name为非空
);
② 创建表完后,添加非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
③ 删除 某个字段的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);
3、为某字段设置默认值
语法格式:
字段名 字段类型 DEFAULT 默认值
Demo:
1 create table student(
2 id int,
3 name varchar(20),
4 sex varchar(2) default '男'
5 )
6
7 -- 添加一条记录,使用默认值
8 insert into student values(6,'赵六',default)
9 -- 添加一条记录,不适用默认值
10 insert into student values(8,'钱九','男')
扩展:如果一个字段设置了非空和为约束,该字段与主键有什么区别?
(1)主键在一个表中,只能有一个。不能出现多个主键。主键可以单列,也可以是多列
(2)自增长只能用在主键上。
五、外键约束
1、单表存储数据的缺点
单表存储数据可能会造成的缺点:
① 数据冗余
② 后期还会出现增删改的问题
解决方式:使用外键约束
2、外键约束
外键约束概念:foreign key,让从表中与主表主键对应的那一列,从而保证数据的正确性。
主表:一方,用来约束别人的表。
从表:多方,被别人约束的表。
示意图:
3、创建约束的语法
① 创建表时增加外键
create table 表名(
....
外键列
[constraint] [外键名称] foreign key (外键列名称) references 主表名称(主表列名称)
);
② 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
③ 创建表之后,添加外键
ALTER TABLE 表名 ADD [CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
4、外键的级联操作
当改变主表中的主键时,修改失败;在删除主表中的记录时,也出现删除失败。
级联操作:在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作。
级联操作语法:
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
on update cascade; 表示级联更新操作
on delete cascade; 表示级联删除操作
六、数据约束总结
约束名 | 关键字 | 说明 |
主键 | primary key |
① 唯一 ② 非空 |
默认 | default | 如果一列没有值,使用默认值 |
非空 | not null | 这一列必须有值 |
唯一 | unique | 这一列不能有重复值 |
外键 | foreign key | 主表中主键列,在从表中外键列 |