数据库学习2024/3/18
十三章_约束
1.约束的基础知识
1.1为什么要约束?为了保护数据的完整性
1.2 什么叫约束?对表中的字段进行限制
1.3 约束的分类:
角度一:约束的字段个数
单列约束 vs 多列约束
角度二:约束作用范围:
列级约束:将此约束声明在对应字段的后面
表级约束:在表中所有字段都声明完,在所有字段的后面声明的约束。
角度三:约束的功能
① not null(非空约束)
② unique(唯一性约束)
③ primary key(主键约束)
④ foregin key(外键约束)
⑤ check(检查约束)
⑥ default(默认值约束)
1.4 如何添加约束
create table 时添加约束
ALTER TABLE 时增加 / 删除约束
2.如何查看约束
information_schema数据库名(系统库)
table_constraints表名称(专门存储各个表的约束)
SELECT * FROM information_schema.table_constraints
WHERE table_name = '表名称';
3.not null(非空约束)
3.1 create table 时添加约束
案例:
CREATE DATABASE test13
USE test13
CREATE TABLE te
(
id INT NOT NULL,
salary DECIMAL
);
3.2ALTER TABLE 时增加约束
ALTER TABLE 表名
MODIFY 字段 数据类型 NOT NULL;
3.3ALTER TABLE 时增删除约束
ALTER TABLE 表名
MODIFY 字段 数据类型 NULL;
4.unique(唯一性约束)
4.1 create table 时添加约束
CREATE TABLE te
(
id INT UNIQUE, #列级约束
email VARCHAR(20),
salary DECIMAL,
#表级约束
#constraint uk_表名_作用字段 unique(作用字段)
CONSTRAINT uk_te_email UNIQUE(email) / UNIQUE(email) );
结论:在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。
结论:可以在声明为unique的字段上添加NULL,而且可以多次添加NULL
4.2 ALTER TABLE 时增加约束
方式1:
ALTER TABLE 表名
MODIFY 字段 数据类型 UNIQUE;
方式2:
ALTER TABLE 表名
ADD UNIQUE KEY(字段名称);
4.3 复合唯一性约束
案例
CREATE TABLE te
(
id INT UNIQUE, #列级约束
email VARCHAR(20),
salary DECIMAL,
#表级约束
#constraint uk_表名_作用字段 unique(作用字段)
CONSTRAINT uk_te_email_sal UNIQUE(email,salary) / UNIQUE(email,salary) );
4.4 ALTER TABLE 时删除约束
添加唯一性约束的列上也会自动创建唯一索引。
删除唯一约束只能通过删除唯一索引的方式删除。
删除时需要指定唯一索引名,唯一索引名就和唯一约束名一样。
如果创建唯一约束时未指定名称,如果是单列,就默认和列名相同;如果是组合列,那么默认和() 中排在第一个的列名相同。也可以自定义唯一性约束名。
如何删除唯一索引
ALTER TABLE 表名
DROP INDEX 唯一索引名;
5 primary key(主键约束):非空且唯一
一个表中最多只能有一个主键约束
表名唯一:PRIMARY
CREATE TABLE te
(
id INT PRIMARY KEY, #列级约束
email VARCHAR(20),
salary DECIMAL,
#表级约束
#constraint uk_表名_作用字段 unique(作用字段)
PRIMARY KEY(email,salary) #没有必要取名字 );
5.2 ALTER TABLE 时增加约束
ALTER TABLE 表名
ADD PRIMARY KEY(字段名称)
5.3 ALTER TABLE 时增加约束(在实际开发中不会删除主键约束)
ALTER TABLE 表名
DROP PRIMARY KEY;
6. auto_increment(自增长列):某个字段的值自增
特点:1.一个表只能有一个auto_increment
2.只能添加在主键或唯一
3.只适用于整数
在开发时,一旦我们给主键添加了auto_increment,则添加字段时不需要添加主键字段的值
6.2ALTER TABLE 时增加auto_increment
ALTER TABLE 表名
MODIFY 字段名 字段类型 AUTO_INCREMENT;
6.3ALTER TABLE 时删除auto_increment
ALTER TABLE 表名
DROP 字段名 字段类型;
6.4 MySQL 8.0新特性—自增变量的持久化
特点:MySQL 8.0将自增主键的计数器持久化到 重做日志 中。每次计数器发生改变,
都会将其写入重做日志中。如果数据库重启,InnoDB会根据重做日志中的信息来初始化计数器的内存值。
7. foregin key(外键约束):限定某个表的某个字段的引用完整性。
7.1 create table 时添加约束
有主表和从表(父表和子表),先创建父表再创建子表
父表
CREATE TABLE dept
(
dept_id INT PRIMARY KEY,
dept_name VARCHAR(15)
)
子表 CREATE TABLE emp
(
emp_id INT,
emp_name VARCHAR(15),
emp_department_id INT,
#表级约束
CONSTRAINT fk_emp_dept_id FOREIGN KEY (emp_department_id) REFERENCES dept(dept_id)/
FOREIGN KEY (emp_department_id) REFERENCES dept(dept_id)(会随机生成索引名) );
7.2添加信息时,只有主表有的信息从表才可以添加
7.3 ALTER TABLE 时增加 FOREIGN KEY
ALTER TABLE 表名
ADD #表级约束
CONSTRAINT fk_emp_dept_id FOREIGN KEY (emp_department_id) REFERENCES dept(dept_id)
7.4 on update cascade on delete set null的用法:
父表和子表同步修改 父表删除数据,子表变为NULL
7.5 ALTER TABLE 时删除 FOREIGN KEY
(1)第一步先查看约束名和删除外键约束
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';#查看某个 表的约束名
ALTER TABLE 从表名 DROP FOREIGN KEY 外键约束名;
(2)第二步查看索引名和删除索引。(注意,只能手动删除)
SHOW INDEX FROM 表名称; #查看某个表的索引名
ALTER TABLE 从表名 DROP INDEX 外键约束名;
8.check(检查约束):检查某个字段的值是否符号xx要求,一般指的是值的范围
8.1create table 时添加约束
MySQL5.7不支持,MySQL8.0支持
CREATE TABLE emp
(
emp_id INT,
emp_name VARCHAR(15),
emp_salary DECIMAL(10,2) CHECK(salary > 2000) #check(条件)
);
9.default(默认值约束)
9.1 CREATE TABLE添加约束
CREATE TABLE emp
(
emp_id INT,
emp_name VARCHAR(15),
emp_salary DECIMAL(10,2) CHECK(salary > 2000) #check(条件)
);
9.2 ALTER TABLE 时添加 DEFAULT 默认值
ALTER TABLE 表名
MODIFY 字段 字段类型 DEFAULT 默认值;
9.2 ALTER TABLE 时删除 DEFAULT 默认值(类似not null)
ALTER TABLE 表名
MODIFY 字段 字段类型;