MySQL之外键约束(FOREIGN KEY语句)

定义

MySQL 外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列。
一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键的值必须等于另一个表中主键的某个值。
外键是表的一个字段,不是本表的主键,但对应另一个表的主键。定义外键后,不允许删除另一个表中具有关联关系的行。

外键的主要作用是保持数据的一致性、完整性。例如,部门表 tb_dept 的主键是 id,在员工表 tb_emp5 中有一个键 deptId 与这个 id 关联。

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

定义一个外键,需要遵循的规则:

  • 父表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
  • 必须为父表定义主键。
  • 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
  • 在父表的表名后面指定列名或列名的组合。这个列或列的组合必须是父表的主键或候选键。
  • 外键中列的数目必须和父表的主键中列的数目相同。
  • 外键中列的数据类型必须和父表主键中对应列的数据类型相同。

语法

  • 在创建表时设置外键约束CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段)

创建student表

CREATE TABLE student(
    id INT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    gender VARCHAR(10) DEFAULT '男'
);

创建score表

CREATE TABLE score(
    scoreid INT PRIMARY KEY,
    studentid INT , 
    scoreresult INT,
    CONSTRAINT fk_score_studentid FOREIGN KEY (studentid) REFERENCES student(id)
);

这个fk_score_studentid前面的fk_是一种命名规则,外键都加fk好辨别。
查看关联情况

mysql> SHOW CREATE TABLE score;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                              |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| score | CREATE TABLE `score` (
  `scoreid` int(11) NOT NULL,
  `studentid` int(11) DEFAULT NULL,
  `scoreresult` int(11) DEFAULT NULL,
  PRIMARY KEY (`scoreid`),
  KEY `fk_score_studentid` (`studentid`),
  CONSTRAINT `fk_score_studentid` FOREIGN KEY (`studentid`) REFERENCES `student` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.10 sec)

  • 在修改表时创建添加外键约束
    ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段);

上面的例子

ALTER TABLE score ADD CONSTRAINT fk_score_studentid FOREIGN KEY(studentid) REFERENCES student(id);

效果跟上面那个是一样的。

  • 删除约束外键
ALTER TABLE 从表名 DROP FOREIGN KEY 外键名;

例子:

ALTER TABLE score DROP FOREIGN KEY fk_score_studentid;

mysql> alter table score drop foreign key fk_score_studentid;
Query OK, 0 rows affected (0.10 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE score;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                      |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| score | CREATE TABLE `score` (
  `scoreid` int(11) NOT NULL,
  `studentid` int(11) DEFAULT NULL,
  `scoreresult` int(11) DEFAULT NULL,
  PRIMARY KEY (`scoreid`),
  KEY `fk_score_studentid` (`studentid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec)

你可能感兴趣的:(MySQL学习笔记)