一、引言
概念:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。
举个例子:
提示说明:(有两张表)
(1)员工表:emp
id:主键、姓名、年龄、工作、薪资、入职时间、上级领导id 以及部门id。这个部门id指定了当前员工是属于哪一个部门的。
(2)外键约束
它关联的另外一张表dept(部门表)的主键id。此时 dept_id 就是员工表当中的一个外键。通过这个外键,让两张表的数据之间产生连接。
(3)
在这种主外键的关系中,把员工表称为子表(具有外键的表),部门表称为父表(外键所关联的这张表)。有时候叫做主表和从表。
(4)目前这种外键关系,它只是逻辑上有这么一个外键。知道外键 dept_id 它关联的就是部门表的主键 id ,但是在数据库层面,并未建立物理外键关联,是无法保证数据的一致性和完整性的。也就是意味着我们直接删除了部门表中的一条数据,如将1号部门删除掉了,此时员工表的数据会不会有变化?其实是不会有任何变化,因为在数据库层面两张表没有任何的关系,只是在逻辑上有一个关系。
接下来去 DataGrip 查看具体情况。
二、创建基本表结构
(1)为两张表做准备工作
(创建表结构并插入基本数据)
部门表:dept
CREATE TABLE dept ( id INT AUTO_INCREMENT COMMENT 'ID' PRIMARY KEY, name VARCHAR(50) NOT NULL COMMENT '部门名称' ) COMMENT '部门表'; INSERT INTO dept (id, name) VALUES (1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办');
表数据插入成功!
员工表:emp
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,'张无忌',20,'项目经理',12500,'2005-12-05',1,1), (3,'杨逍',33,'开发',8400,'2000-11-03',2,1), (4,'韦小笑',48,'开发',11000,'2002-02-05',2,1), (5,'常遇春',43,'项目经理',10500,'2004-09-07',3,1), (6,'小昭',19,'程序员鼓励师',6600,'2004-10-12',2,1);
表数据插入成功!
三、问题与解决
目前这两张表逻辑上有着关联,员工表中的部门id:dept_id 对应着部门表的 id 。但是我们没有设置它们之间的物理外键,就无法保证数据的完整性。
如果没有设置,那么当我删除部门表中的任意一个id,那么员工表的数据没有任何变化,就会出现数据不完整和一致性的问题。所以我们就要去学习建立外键关联。
四、添加外键约束
(1)语法
添加外键。语法有两种情况。
第一种(是在创建表的时候):直接添加
第二种: (表结构创建好了之后):额外增加这样的一个外键就可以用了
注意:
1、ALTER TABLE 表名 :修改指定表名
2、ADD CONSTRAINT:add constraint :添加 限制
3、外键名称可以自己定义
4、ROREIGN KEY :foreign key: 外键
5、REFERENCES :references:参考
(2)对上面的两张表进行操作
给员工表 emp 添加外键。
/* add constraint 外键 括号里代表的外键字段 */
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept(id);
执行前的表视图:
执行后的表视图:
这时就成功添加好了外键约束了。
(3)测试外键的作用是否对数据的完整性有用
外键添加成功之后。这次测试一下再去删除部门表 dept 中的id字段,看能不能删除成功?
因为要删除父表 dept 中id为1的字段,而子表 emp 中的字段dept_id 还有那么多值关联着id=1的记录,不能直接删除,这样就保证了数据的一致性和完整性。
五、删除外键约束
语法:
注意:
1、ALTER TABLE :修改指定表
2、DROP:删除
操作:
ALTER TABLE emp DROP FOREIGN KEY fk_emp_dept_id;
外键删除成功!
这篇博客的所有内容就到这了。