基础知识:
1.概念:约束是作用于表中字段的规则,用于限制存储在表中的数据
2.目的:保证数据库中的数据正确、有效性和完整性
3.分类:
约束 : 描述 | 关键字非空约束: 限制改数据不能为null | not null
唯一约束:保证改字段所有数据都是唯一、不重复的 | unque
主键约束:主键约束是一行数据的唯一标识,要求非空且唯一 | primary keyy(auto_increment--实现主键的自动增长)
默认约束:保存数据时,如果没有指定改字段的值,则采用默认值 | default
检查约束:保证字段满足某一个条件 | check
外键约束:用来让两张表的数据之间建立连接,保证数据的一致性和完整性 | foreign key
基础约束case:
按照如下限制规则创表:
create table user(
id int primary key auto_increment comment'主键',
name char(10) not null unique comment'姓名',
age int check(age>0 && age<120) comment'年龄',
status char(1) default '1' comment'状态',
gender char(1) comment'性别')comment '员工表';
图中:-- 黄色钥匙代表 --- 主键
-- 蓝色边框代表 不可重复
insert测试:
我们上面insert并没有添加主键id,而是让他自增长,得到以下数据
unique--不准重复
not null --不能为空
age 被check 严密限制着
合适的年龄范围才insert成功,但是注意这里的主键id是4,虽然我们之前的操作不会添加数据,但是主键id还是处于自增的一个状态,已经到3了,现在能insert了又自增一次,得到4
default如果--如果不给status 传递数据,我们就取默认值 '1'
外键约束
添加外键:
1.创建表的时候添加:
create table 表名(
[constraint][外键名称] foreign key(外键字段名) erferences 主表(主表列名););
2. 对已经存在的表添加:
alter table 表名 add constraint 外键名称 foreign key(外键字段名) references 主表(主表列名);
删除外键:
alter table 表名 drop foreign key 外键名称;
- 删除/更新的行为:
no action / restrict 进行外键关联时,不允许进行 删除/更新cascade 外键关联的父表更改/删除时带子表内容一起
set null 外键关联的父表删除/更新时子表对应内容设置为null
set default 父表有变时子表将外键设置成一个默认值(Innodb不支持) -- 了解即可
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update set null on delete set null;
注意: 约束是作用于表中的字段上的,可以在创建表/修改表的时候添加约束
外键约束case:
先执行以下语句建表:
create table dept(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '部门名称'
) comment '部门表';
insert dept(id,name) values(1,'研发部'),
(2,'市场部'),
(3,'财务部'),
(4,'销售部'),
(5,'总经办');
create table emp(
id int auto_increment comment 'ID' primary key,
name varchar(50) not null comment '姓名',
age int comment '年龄',
job varchar(20) comment '职位',
salary int comment '薪资',
entrydate date comment '入职日期',
managerid int comment ' 直属领导ID',
dept_id int comment '部门ID'
)comment '员工表';
INSERT INTO emp (id, name, age, job, salary, entrydate, managerid, dept_id)
values
(1,'王富贵',66,'总裁',20000,'2000-01-01',null,5),
(2,'张哥',39,'经理',12000,'2012-03-22',1,1),
(3,'杨哥',22,'开发',8400,'2021-02-23',2,1),
(4,'笑笑',32,'开发',11000,'2020-12-01',2,1),
(5,'啊giao',28,'开发',10500,'2019-5-26',3,1),
(6,'小王',22,'程序员助理',6600,'2023-12-01',2,1);
添加基本外键约束:
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id);
查看emp属性,出现了外键约束
有外键约束的内容页不允许修改和删除的,因为他默认 no action / restrict 行为关联,不允许删除和更改
删除外键:
alter table emp drop foreign key fk_emp_dept_id;
执行删除后外键名字爆红,说明已经不存在了。
外键常用行为:
cascade
添加外键: alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade ; 修改
删除
上面操作可以看出cascade修饰的外键,父表修改/删除时,子表也会进行相应的删除更改。
set null
添加外键
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update set null on delete set null;
可以看到父表中外键关联内容删除后,子表对应的内容会被修改成null