MySQL外键约束的使用
MySQL 外键用来在两个表的数据之间建立连接,可以是一列或者多列。一个表可以有一个或多个外键。
外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。
外键及其相关名词释义如下:
外键的作用有两个:
MySQL 创建外键的语法规则如下:
【示例】定义数据表 tb_emp5,并在 tb_emp5 表上创建外键约束。
创建一个部门表 tb_dept1,表结构如表1所示,SQL 语句如下:
定义数据表 tb_emp5,让它的字段 deptId 作为外键关联到 tb_dept1 的主键 id,SQL 语句为:
子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配,如果类型不一样,则在创建子表时,就会出现错误:
外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。
外键及其相关名词释义如下:
外键
它是表中的一个字段,虽然可以不是本表的主键,但要对应另外一个表的主键。外键的作用有两个:
- 第一个作用是保证数据引用的完整性。定义外键后,不允许删除在另一个表中具有关联关系的行。
- 第二个作用是保持数据的一致性、完整性。例如,部门表 tb_dept 的主键是 id,在员工表 tb_emp5 中有一个键 deptId 与这个 id 关联。
主表(父表)
对于两个具有关联关系的表而言,相关联字段中主键所在的那个表即是主表。从表(子表)
对于两个具有关联关系的表而言,相关联字段中外键所在的那个表即是从表。MySQL 创建外键的语法规则如下:
[CONSTRAINT <外键名>] FOREIGN KEY 字段名1 [ ,字段名2,…] REFERENCES <主表名> 主键列1 [ ,主键列2,…]细节说明:
- “外键名”为定义的外键约束的名称,一个表中不能有相同名称的外键;
- “字段名”为子表需要添加外键约束的字段列;
- “主表名”为被子表外键所依赖的表的名称;
- “主键列”为主表中定义的主键列,或者列组合。
【示例】定义数据表 tb_emp5,并在 tb_emp5 表上创建外键约束。
创建一个部门表 tb_dept1,表结构如表1所示,SQL 语句如下:
CREATE TABLE tb_dept1 ( id INT PRIMARY KEY, name VARCHAR(22) NOT NULL, location VARCHAR(50) );
字段名称 | 数据类型 | 备注 |
---|---|---|
id | INT | 部门编号 |
name | VARCHAR(22) | 部门名称 |
location | VARCHAR(50) | 部门位置 |
定义数据表 tb_emp5,让它的字段 deptId 作为外键关联到 tb_dept1 的主键 id,SQL 语句为:
CREATE TABLE tb_emp5 ( id INT PRIMARY KEY, name VARCHAR(25), deptId INT, salary FLOAT, CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id) );以上语句执行成功之后,在表 tb_emp5 上添加了名称为 fk_emp_dept1 的外键约束,外键名称为 deptId,其依赖于表 tb_dept1 的主键 id。
温馨提示
MySQL 中的关联,指的是在关系型数据库中相关表之间的联系,它是通过相容或相同的属性或属性组来表示的。子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配,如果类型不一样,则在创建子表时,就会出现错误:
ERROR 1005 (HY000): Can’t create table’database.tablename’(errno:150)