目录
1.约束(constraint)的概述
2.约束的分类
1.约束的字段的个数:
2.约束的作用范围:
3.约束的作用/功能
3.如何添加约束
4.如何查看约束
5.非空约束(not null)
6.唯一性约束(unique)
7.主键约束- primary key约束(一定要有)
8.自增列:AUTO- increment
9.外键约束- foreign key
10.check约束和default约束
1. check约束
2. default约束
11.注意事项
1.约束(constraint)的概述
1.作用:为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制
2.数据完整性:数据完整性就是指数据的准确和可靠性。
作用:防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息
3.限制对象:对表中字段的限制;
2.约束的分类
1.约束的字段的个数:
单列约束/多列
2.约束的作用范围:
列级约束:将约束声明在对应字段后面
表级约束:在表中所有字段后面声明约束
3.约束的作用/功能
• not null(非空约束)
• unique(唯一性约束)
• primary key(主键约束)
• foreign key(外键约束)
• check(检查约束)
• default(默认值约束)
3.如何添加约束
• create table时添加约束(推荐)
• alter table时增/删约束
#创建表时就添加约束
CREATE TABLE offices(
officeCode INT(10) PRIMARY KEY,
city VARCHAR(50) NOT NULL,
address VARCHAR(50),
country VARCHAR(50) NOT NULL,
postalCOde VARCHAR(50) UNIQUE
);
#创建表后添加约束
#设置主键约束
ALTER TABLE books
ADD PRIMARY KEY (id);
#设置非空约束
ALTER TABLE books
MODIFY NAME VARCHAR(50) NOT NULL;
4.如何查看约束
SELECT *
FROM information_schema.table_constraints
WHERE TABLE_NAME = 'employees';
查询结果:
5.非空约束(not null)
1. 限制某字段/列的值不为空
2. 默认所有类型的值都可以是null
3. not null只能某个列单独限定非空,不能组合非空
4. 空字符串不等于null,0也不等于null
ALTER TABLE books
MODIFY price NOT NULL;
6.唯一性约束(unique)
1. 限制某个字段/某列的值不能重复
2. 唯一性约束,允许出现多个空值null
3. mysql会给唯一约束的列默认创建一个唯一索引
4. 创建唯一约束时,如果不命名则默认与列名相同
5. 添加约束的两种方式
#第一种方式
CREATE TABLE orders
c_id INT(11), UNIQUE;
#第二种方式
ALTER TABLE test
MODIFY last_name VARCHAR(15) UNIQUE;
6. 复合的唯一性约束
CREATE TABLE orders(
id INT,
NAME VARCHAR(15),
PASSWORD VARCHAR(15),
CONSTRAINT user_name_pwd UNIQUE(NAME,PASSWORD)
);
7. 删除唯一性约束
• 添加唯一性约束的列上也会自动创建唯一索引
• 删除唯一约束只能通过删除唯一索引的方式删除
• 删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样
• 如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和()中排在第一个的列名相同。也可以自定义唯一性约束名
• 删除方法
7.主键约束- primary key约束(一定要有)
1. 作用:用来唯一标识表中的一行记录
2. 特点:主键约束相当于唯一约束+非空约束,主键约束列不允许重复,也不允许出现空值
3. 一个表最多有一个主键约束
4. mysql的主键名都是primary,无法自主命名
5. 创建主键约束时,默认在所在列建立对应的主键索引
6. 如何添加主键约束?
#只是放一起做对比,主键约束最多只有一个,不能重复
CREATE TABLE orders(
#列级约束
#o_num INT(11) PRIMARY KEY,
o_date DATE,
c_id INT(11),
#表级约束
CONSTRAINT fk_orders_cId FOREIGN KEY(c_id)
);
7. 如何删除主键约束(在实际开发中,不会去删除表中的主键约束)
ALTER TABLE test
DROP PRIMARY KEY;
8.自增列:AUTO- increment
1. 作用:某个字段的值自增
2. 一个表中最多一个自增长列
3. 自增长约束列必须是键列(主键列,唯一键列)
4. 自增列数据类型必须为整数数据类型
5. 当我们向主键(含auto- increment)的字段上添加0或null时,实际上会自动的往上添加指定的字段的数值(即自增)
6. 开发中,一旦主键作用的字段上声明有
AUTO- increment,则在添加数据时,不要 给主键对应的字段去赋值
1. 如何添加自增列?
2. 如何删除自增列?
3. mysql8.0新特性-自增变量的持久化
• 在mysql服务器重启之后,8.0中仍会在重做日志保存删除后的变量,5.7中只是在内存中保留,重启后消失。
#方式一
CREATE TABLE orders(
o_num INT(11) PRIMARY KEY AUTO_INCREMENT,
o_date DATE);
#方式二
ALTER TABLE test
MODIFY id INT AUTO_INCREMENT;
9.外键约束- foreign key
1. 作用:限定某个表的某个字段的引用完整性
2. 主表(父表):被引用的表/被参考的表
3. 从表(子表):引用/参考他人的表
4. 从表的外键列,必须引用主表的主键/唯一约束列
5. 若不给外键约束命名,则默认自动产生一个外键名
6. 删表:先删从表再删主表
7. 创建外键约束时,默认会在所在列上建立对应的普通索引;删除外键约束时要手动删除索引
8. 如何添加外键约束
#先创建主表
CREATE TABLE dept1(
dept_id INT PRIMARY KEY,
dept_name VARCHAR(15)
);
#再创建从表
CREATE TABLE emp1(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(15),
department_id INT
);
#将department_id作为外键与dept2中的dept_id保持一致
ALTER TABLE emp1
ADD CONSTRAINT fk_emp2_dept_id FOREIGN KEY(department_id) REFERENCES dept2(dept_id);
9. 约束等级:cascade方式;set null方式
• 结论:对于外键约束,最好是采用: on update cascade on delete restrict
• 在mysql中,外键约束是有成本的,需要消耗系统资源。对于并发的SQL操作,有可能不适合;因为外键约束的系统开销而变得非常慢。故mysql不得使用外键约束,一切外键概念必须在应用层解决。
10.check约束和default约束
1. check约束
检查某个字段的值是否符合要求,一般指的是值得范围;5.7不支持;8.0支持check约束
CREATE TABLE emp2(
emp_id INT,
emp_name VARCHAR(15),
salary DECIMAL(10,2) CHECK(salary > 2000)
);
2. default约束
给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值
CREATE TABLE emp3(
emp_id INT,
emp_name VARCHAR(15),
salary DECIMAL(10,2) DEFAULT 2000
);
11.一些注意事项
• 为什么建表时,加not null/default’’/default 0?
答:不想让表中出现null值
• 为什么不要null值?
答:在运算时不好比较;效率不高,影响提高索引效果
• 带auto- increment约束的字段值是从一开始吗?
答:默认是从1开始,但也可以设置初始值,从初始值开始自增。
• 是不是每个表都能够任意选择存储引擎?
答:外键约束不能跨引擎使用;mysql支持多种存储引擎,每个表都可以指定一个不同的存储引擎,但外键约束用来保证数据的参照完整性的,如果表之间需要关联外键,却指定了不同的存储引擎,那么这些表之间不能创建外键约束。因此不能随意选择存储引擎。