欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL6——外键约束

程序员文章站 2022-05-30 13:21:44
...

外键介绍

        外键用来在两个表的数据之间建立链接,可以是一列或者多列。一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。
        外键首先是表中的一个字段,可以不是本表的主键,但要对应另外一个表的主键。外键的主要作用是保证数据引用的完整性,定义外键后,不允许删除在另一个表中具有关联关系的行。外键的作用是保持数据的一致性、完整性。
        例如:部门表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值的介绍

  1. 如果Key是空的, 那么该列值的可以重复, 表示该列没有索引, 或者是一个非唯一的复合索引的非前导列
  2. 如果Key是PRI, 那么该列是主键的组成部分
  3. 如果Key是UNI, 那么该列是一个唯一值索引的第一列(前导列),并别不能含有空值(NULL)
  4. 如果Key是MUL, 那么该列的值可以重复, 该列是一个非唯一索引的前导列(第一列)或者是一个唯一性索引的组成部分但是可以含有空值NULL,也就是外键约束。

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

本专题为个人学习笔记,学习材料为《MySQL5.7从零开始学》。

相关标签: MySQL mysql