MySQL外键约束(FOREIGN KEY)
MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。
外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜等 4 种水果,那么,你来到水果摊要买水果就只能选择苹果、桃子、李子和西瓜,其它的水果都是不能购买的。
主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。
定义外键时,需要遵守下列规则:
主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
必须为主表定义主键。
主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
外键中列的数目必须和主表的主键中列的数目相同。
外键中列的数据类型必须和主表主键中对应列的数据类型相同。
实例:
--创建用户表并将UID设为主键
DROP TABLE IF EXISTS tbl_user;
CREATE TABLE tbl_user (
uId INT NOT NULL AUTO_INCREMENT COMMENT '用户编号',
uName VARCHAR(50) NOT NULL COMMENT '用户名',
uPass VARCHAR(10) NOT NULL COMMENT '密码',
head VARCHAR(50) NOT NULL COMMENT '头像',
regTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
gender smallint(6) NOT NULL COMMENT '性别',
PRIMARY KEY (uId) /*设置用户编号为主键*/
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--创建版块表,并将版块编号设为主键
DROP TABLE IF EXISTS tbl_board;
CREATE TABLE tbl_board (
boardid INT NOT NULL AUTO_INCREMENT COMMENT '版块编号',
boardName VARCHAR(50) NOT NULL COMMENT '版块标题',
parentId INT NOT NULL COMMENT '父版块编号',
PRIMARY KEY (boardid) /*设置版块编号为主键*/
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--创建帖子表,并将帖子编号设为主键,同时建立与用户表和版块表的关联关系
DROP TABLE IF EXISTS tbl_topic;
CREATE TABLE tbl_topic (
topicId INT NOT NULL AUTO_INCREMENT COMMENT '帖子编号',
title VARCHAR(50) NOT NULL COMMENT '帖子标题',
content VARCHAR(1000) NOT NULL COMMENT '帖子内容',
publishTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '发帖时间',
modifyTime TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改时间',
uId INT NOT NULL COMMENT '用户编号',
boardId INT NOT NULL COMMENT '版块编号',
PRIMARY KEY (topicId), /*设置主键*/
FOREIGN KEY FK_UID (uId) REFERENCES tbl_user(uId),/*设置外键*/
FOREIGN KEY FK_BID (boardId) REFERENCES tbl_board(boardId) /*设置外键*/
) ENGINE=InnoDB DEFAULT CHARSET=utf8;