MySQL 8.x从入门到精通(视频教学版)
上QQ阅读APP看书,第一时间看更新

2.3.3 使用外键约束

外键用来在两个表的数据之间建立连接,可以是一列或者多列。一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。

外键及其相关名词释义如下:

● 外键:它是表中的一个字段,虽然可以不是本表的主键,但要对应另外一个表的主键。外键的第一个作用是保证数据引用的完整性。定义外键后,不允许删除在另一个表中具有关联关系的行;第二个作用是保持数据的一致性、完整性。例如,部门表tb_dept的主键是id,在员工表tb_emp5中有一个键deptId与这个id关联。

● 主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的那个表即是主表。

● 从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的那个表即是从表。

创建外键的语法规则如下:

     [CONSTRAINT <外键名>] FOREIGN KEY 字段名1 [ ,字段名2,…]
     REFERENCES <主表名> 主键列1 [ ,主键列2,…]

“外键名”为定义的外键约束的名称,一个表中不能有相同名称的外键;“字段名”为子表需要添加外键约束的字段列;“主表名”为被子表外键所依赖的表的名称;“主键列”为主表中定义的主键列,或者列组合。

【例2.8】定义数据表tb_emp5,并在tb_emp5表上创建外键约束。

创建一个部门表tb_dept1,表结构如表2.2所示,SQL语句如下:

     CREATE TABLE tb_dept1
     (
     id INT PRIMARY KEY,
     name VARCHAR(22) NOT NULL,
     location VARCHAR(50)
     );

表2.2 tb_dept1 表结构

定义数据表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。

提示:关联指的是在关系型数据库中相关表之间的联系。它是通过相容或相同的属性或属性组来表示的。子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配,如果类型不一样,则在创建子表时,就会出现错误“ERROR 1005 (HY000): Can’t create table’database.tablename’(errno:150)”。