外键约束(了解,开发中不用)
首先先写一个表中,可以正常插入
create table employee(employee_id int primary key auto_increment, employee_name varchar(65) not null, gender char(1) default '女', dept_name varchar(10) not null);
这时候我们发现了一个问题,员工表和部门表应该是分开的,耦合度太高了,怎么办
拆开成两张表
create table department(department_id int primary key auto_increment, department_name varchar(10) not null default '销售部'); create table employee(employee_id int primary key auto_increment, employee_name varchar(65) not null, gender char(1) default '女', dept_id int not null);
然后发现没有部门id也能插入成功,并且删除了部门表中的字段,员工表中的数据还存在,这也是不符合逻辑的。我们可以使用外键约束使员工表中的部门id和部门表中的id进行关联。
外键约束的格式:
# 使用外键约束,让两个表的字段存在关联关系con create table 表名(constraint 外键名 foreign key (受到约束的字段) references 约束数据表 (约束数据表中对应的字段)); # 例:create table employee(employee_id int primary key auto_increment, employee_name varchar(65) not null, gender char(1) default '女', dept_id int not null, constraint fk_employee_department foreign key (dept_id) references department (department_id));
时间戳 从1970年1月1日0点0分0秒到现在的秒数 timestamp 修饰时间的数据类型
一般会设置 default current_timestamp ,表示默认由当前时间创建
create table employee(employee_id int primary key auto_increment, employee_name varchar(65) not null, gender char(1) default '女', dept_id int not null, create_time timestamp default current_timestamp, constraint fk_employee_department foreign key (dept_id) references department (department_id));
【注意】外键约束之后会有如下特点:
1、先添加主表(部门表),再添加从表(员工表)
2、先删除从表,再删除主表
3、先修改从表,再修改主表
4、使用外键以后约束以后,数据就会变的非常乱,不利于程序员的思维方式
级联操作
使用外键的时候,操作从表和主表都会存在问题 可以使用级联,强制删除或修改外键,会直接影响到被关键的键
级联删除: on delete cascade 级联修改: on update cascade
# 级联删除格式 create table 表名(constraint 外键名 foreign key (受到约束的字段) references 约束数据表 (约束数据表中对应的字段) on delete cascade); # 例如:create table employee(employee_id int primary key auto_increment, employee_name varchar(65) not null, gender char(1) default '女', dept_id int not null, create_time timestamp default current_timestamp, constraint fk_employee_department foreign key (dept_id) references department (department_id) on delete cascade);
# 级联修改格式 create table 表名(constraint 外键名 foreign key (受到约束的字段) references 约束数据表 (约束数据表中对应的字段) on update cascade); # 例如:create table employee(employee_id int primary key auto_increment, employee_name varchar(65) not null, gender char(1) default '女', dept_id int not null, create_time timestamp default current_timestamp, constraint fk_employee_department foreign key (dept_id) references department (department_id) on update cascade);