定义
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的外键约束(FOREIGN KEY)用于确保数据的完整性,它将一个表的字段与另一个表的主键关联。外键可以为空,但非空外键值必须匹配参照表的主键值。外键的主要作用是维护数据一致性。创建外键时,需遵循特定规则,如父表必须存在,外键列数和数据类型需与父表主键匹配等。可以通过创建表时设置或后续修改表来添加外键,也可以删除约束。
&spm=1001.2101.3001.5002&articleId=100081515&d=1&t=3&u=2fd2b2508f024ea181d0a70a5759e800)
2808

被折叠的 条评论
为什么被折叠?



