为什么要有多表?
– 创建一个员工表包含如下列(id, name, age, dep_name, dep_location),id主键并自动增长,添加5条数据
代码示例:

CREATE TABLE emp (
id INT PRIMARY KEY auto_increment,
name VARCHAR(40),
age int,
dep_name VARCHAR(40),
dep_location VARCHAR(30)
);


INSERT INTO emp (name, age, dep_name, dep_location) VALUES ('张三', 20, '研发部','广州');
INSERT INTO emp (name, age, dep_name, dep_location) VALUES ('李四', 21, '研发部','广州');
INSERT INTO emp (name, age, dep_name, dep_location) VALUES ('王五', 20, '研发部','广州');
INSERT INTO emp (name, age, dep_name, dep_location) VALUES ('老王', 20, '销售部','深圳');
INSERT INTO emp (name, age, dep_name, dep_location) VALUES ('大王', 22, '销售部','深圳');
INSERT INTO emp (name, age, dep_name, dep_location) VALUES ('小王', 18, '销售部','深圳');

– 单表的缺点:表中出现了很多重复的数据(数据冗余),如果要修改研发部的地址需要修改3个地方。

解决方案:将一张表分成2张表(员工表和部门表)
代码示例:

-- 创建部门表
CREATE TABLE department(
id INT PRIMARY KEY auto_increment,
dep_name VARCHAR(40),
dep_location VARCHAR(30)
);

-- 创建员工表
CREATE TABLE employee(
id INT PRIMARY KEY auto_increment,
name VARCHAR(40),
age INT,
dep_id INT
);

-- 添加两个部门
INSERT INTO department(dep_name , dep_location) VALUES('研发部' , '广州');
INSERT INTO department(dep_name , dep_location) VALUES('销售部' , '深圳');

-- 添加员工
INSERT INTO employee (name, age, dep_id) VALUES
('张三', 20, 1),
('李四', 21, 1),
('王五', 20, 1),
('老王', 20, 2),
('大王', 22, 2),
('小王', 18, 2);

问题: 当我们在employee的dep_id里面输入不存在的部门,数据依然可以添加.但是并没有对应的部
门,不能出现这种情况。employee的dep_id中的内容只能是department表中存在的id

**目标:**需要约束dep_id字段的值, 只能是department表中已经存在id 解决方式:使用外键约束

外键约束作用

用来维护多表之间关系

外键: 从表中的某个字段,该字段的值是引用主表中主键的值 主表: 约束别人的表 副表/从表: 被别人约束的表

如下图:

mysql 一个有外键的表如何入库更新_mysql


**外键的语法
添加外键

1. 新建表时增加外键:

[CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)

关键字解释:

CONSTRAINT – 约束关键字

FOREIGN KEY(外键字段名) –- 某个字段作为外键

REFERENCES – 主表名(主键字段名) 表示参照主表中的某个字段

2. 已有表增加外键:

ALTER TABLE 从表名 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名)

REFERENCES 主表(主键字段名);

已有表添加外键:
代码示例:

-- 已有表添加外键
ALTER TABLE employee ADD  CONSTRAINT dep_exm_fk1 FOREIGN KEY(dep_id) REFERENCES department(id);

-- 删除外键
ALTER TABLE employee DROP FOREIGN KEY dep_exm_fk1;

新建表的时候添加外键:
代码示例:

-- 语法:	
-- 		[CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主键字段名);

-- 创建员工表
CREATE TABLE employee(
id INT PRIMARY KEY auto_increment,
name VARCHAR(40),
age INT,
dep_id INT,
CONSTRAINT dep_exm_fk1 FOREIGN KEY(dep_id) REFERENCES department(id)
);

-- 删除外键
alter table employee drop foreign key dep_exm_fk1;

– 级联操作
– 在修改和删除主键时,同时更新或者删除副表的外键值,称为级联操作
– 语法:
– on update cascade 级联更新,主表主键发生更新时,外键也会更新
– on delete cascade 级联删除,主表主键发生删除时,外键也会删除

-- 添加外键,并设置外键级联更新和级联删除
alter table employee add constraint dep_emp_fk1 foreign key(dep_id) references department(id) on update cascade on delete cascade; 
 
--  修改销售部id 为 5
update department set id = 5 where id = 2;

delete from department where id = 5 ;