一、外键约束
约束的作用:保证数据的完整性
单表约束 :主键约束、 非空约束、唯一约束
外键约束: 保证数据的完整性(多表之间)
数据准备:
CREATE TABLE dept(
did INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(20)
);
INSERT INTO dept VALUES (NULL,'市场部');
INSERT INTO dept VALUES (NULL,'人事部');
INSERT INTO dept VALUES (NULL,'教研部');
CREATE TABLE employee(
eid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(20),
salary DOUBLE,
birthday DATE,
sex VARCHAR(10),
dno INT
);
INSERT INTO employee VALUES (NULL,'张三',8000,'1988-09-01','男',3);
INSERT INTO employee VALUES (NULL,'李四',9000,'1988-09-01','男',1);
INSERT INTO employee VALUES (NULL,'王五',6000,'1988-09-01','男',2);
INSERT INTO employee VALUES (NULL,'赵六',10000,'1988-09-01','男',3);
INSERT INTO employee VALUES (NULL,'孙七',10000,'1988-09-01','男',1);
原则上每个员工都有属于自己的部门,如果这两个表不设置约束,那么可以删除有员工的部门,插入没有部门的员工
如下:
实际中这种操作是不允许的,存在员工的部门不能删除,也不可能有员工没有所属部门,所以就要添加外键的作用
首先给这两表添加外键约束
ALTER TABLE employee ADD FOREIGN KEY (dno) REFERENCES dept(did)
这样再删除有关联记录的数据就会报错
让外键不能为空
ALTER TABLE employee MODIFY dno INT NOT NULL;
这样再想添加部门为空的员工数据就会报错
二、表与表之间的关系
1.一对一
例如: 一个人只能有一个身份证号,一个身份证号只能属于一个人
2.一对多
例如:一名学生只能属于一个班级,但是一个班级可以有很多个学生
3.多对多
例如: 一名老师可以有很多学生,一个学生也可以有很多个老师
三、建表原则
(1)一对一的建表原则
- 唯一外键对应
- 假设是一对多,在多的一方创建外键(新加一个字段)指向一的一方的主键,将外键设置为unique。
- 主键对应
- 将两个表的主键建立对应关系即可。
(2)一对多的建表原则
在多的一方创建外键指向一的一方的主键
(3)多对多的建表原则
需要创建中间表,中间表中至少两个字段,分别作为外键指向多对多双方的主键