外键约束
外键是构成表与表关联的唯一途径。一个表的外键引用另一个表或自身表的主键,外键所在的表称为从表,外键引用的表称为主表。
创建外键有以下两个途径:
- 在创建表的时候指定某个列为外键列;
- 在修改表的时候添加某个列为外键列。
外键有以下特性:
- 外键必须是另一表或自身表的主键的值;
- 外键可以重复;
- 外键可以为空;
- 一张表中可以有多个外键。
1.创建表时指定外键列
(1)外键的关键词是FOREIGN KEY,创建一个数据库exam,然后在该数据库中先创建一个部门表dept,然后再创建一个员工表emp,如图1-1所示:
图1-1 创建数据库与表
图1-1中,建立外键的语句如下:
- CONSTRAINT 约束名称 FOREIGN KEY(外键列名) REFERENCES 关联表(关联表的主键)
创建emp表的sql语句如下:
CREATE TABLE emp(
empno INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(50),
deptno INT ,
CONSTRAINT fk_emp_dept FOREIGN KEY(deptno) REFERENCES dept(deptno)
语句中,外键列名deptno是指emp表中外键的名称,关联表是dept,关联表的主键名为deptno,与外键名称相同,也可以不同。需要注意的是emp表中引用了dept表的主键,因此创建表时要先创建dept表,再创建emp表,否则会出错。
(2)向dept表中插入记录,如图1-2所示:
图1-2 dept表记录
(3)emp表的主键是自增长的,因此向emp表中插入记录时可以不用指定主键值,如图1-3所示:
图1-3 向emp表中插入记录
图1-3中,插入的记录没有提供外键的值,外键的值为null,表明了外键可以为null。
(4)向emp表中插入外键值相同的两条记录,如图1-4所示:
图1-4 插入外键值相同的记录
图1-4中,张三和李四的部门号相同,表明了外键是可以重复的。
(5)向emp表中插入一条记录,该记录的部门号在部门表中并不存在,如图1-5所示:
图1-5 插入不存在的外键值
图1-5中,当插入的记录的外键值没有引用dept表中的主键时,插入失败,因此,外键值如果不为空,那么一定要是主表的主键中的任意一个。
2.修改表是指定外键列
修改表时添加外键列的语句如下:
- ALERT TABLE 表名
ADD CONSTRAINT 约束名称 FOREIGN KEY(外键列名) REFERENCES 关联表(关联表的主键);
(1)将emp表删除,重新创建一个emp表,如图1-6所示:
图1-6 创建无外键的emp表
(2)为emp表添加外键,如图1-7所示:
图1-7 为表添加外键约束
(3)向emp表中添加一条记录,如图1-8所示:
图1-8 插入记录
图1-8中,插入一条记录,该记录的外键值为50,而dept表的主键值不存在这个值,因此违反了外键约束,所以插入失败,表明修改表时添加外键约束成功。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/253225.html