MySQL6——外键约束
外键介绍
外键用来在两个表的数据之间建立链接,可以是一列或者多列。一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。
外键首先是表中的一个字段,可以不是本表的主键,但要对应另外一个表的主键。外键的主要作用是保证数据引用的完整性,定义外键后,不允许删除在另一个表中具有关联关系的行。外键的作用是保持数据的一致性、完整性。
例如:部门表tb_dept的主键是id,在员工表tb-emp5中有一个键deptId与这个id关联。
主从表的关系
主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的那个表。
从表(子表):对于两个具有关联关系的表而言,相关联字段中外键存在的那个表。
外键的创建
外键只能在定义完所有列后创建,其语法规则如下:
[CONSTRAINT 约束名] FOREIGN KEY(字段名1[, 字段名2, ……, 字段名n]) REFERENCES 主表名(主键列1[, 主键列2, ……, 主键列n])
约束名为定义的约束的名称,一个表中不能有相同名称的同类型约束;字段名标识子表需要添加外键约束的字段列,主表名标识被子表外键所依赖的表的名称;外键列表示主表中定义的主键列,或则组合列主键。
例题:定义数据表tb_emp5和tb_emp6,并在tb_emp6表上创建外键约束关联tb_emp5表中的id字段
mysql> # 创建tb_emp5表
mysql> CREATE TABLE tb_emp5
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(22) NOT NULL,
-> location VARCHAR(50)
-> );
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> # 创建tb_emp6表,并给deptId字段添加外键约束管理tb_emp5表中的id字段。+
mysql> CREATE TABLE tb_emp6
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> deptId INT(11),
-> salary FLOAT,
-> CONSTRAINT Fk_tb_emp5_tb_emp6 FOREIGN KEY(deptId) REFERENCES tb_emp5(id)
-> );
Query OK, 0 rows affected, 2 warnings (0.03 sec)
此时,在tb_emp6上添加了名为Fk_tb_emp5_tb_emp6的外键约束,外键名为deptId,管理tb_emp5表中的id字段。通过DESCRIBE tb_emp6;语句查看表结构:
mysql> DESCRIBE tb_emp6;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(25) | YES | | NULL | |
| deptId | int(11) | YES | MUL | NULL | |
| salary | float | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
可以看见deptId字段的Key的值为MUL。
Key值的介绍
- 如果Key是空的, 那么该列值的可以重复, 表示该列没有索引, 或者是一个非唯一的复合索引的非前导列
- 如果Key是PRI, 那么该列是主键的组成部分
- 如果Key是UNI, 那么该列是一个唯一值索引的第一列(前导列),并别不能含有空值(NULL)
- 如果Key是MUL, 那么该列的值可以重复, 该列是一个非唯一索引的前导列(第一列)或者是一个唯一性索引的组成部分但是可以含有空值NULL,也就是外键约束。
提示!关联指的是在关系型数据库中,相关表之间的联系。是用过相容或相同的属性或属性组来表示的。子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配,如果类型不一样,那么创建主表时会出现错误”ERROR 1005 (HY000): Can’t create table’database.tablename’(errno:150)“
本专题为个人学习笔记,学习材料为《MySQL5.7从零开始学》。
上一篇: XML与DTD的作用及两者间的关系