一、引言
概念:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。
举个例子:
提示说明:(有两张表)
(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;
外键删除成功!
这篇博客的所有内容就到这了。