方法一:在建表的时候添加外键约束
先建立一个年级表Grade
CREATE TABLE `Grade` (
`gradeid` int(10) NOT NULL AUTO_INCREMENT COMMENT '年级编号',
`gradename` varchar(50) NOT NULL COMMENT '年级',
PRIMARY KEY (`gradeid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
在建立一个学生表,其中gradeid属性不为学生表Student的主码,但是为年级表Grade的主码,故外键为gradeid。学生表Student为参照关系,年级表Grade为被参照关系(关系数据库中一个表就是一个关系)。
CREATE TABLE `Student` (
`id` int(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`pwd` varchar(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`Sname` varchar(20) NOT NULL DEFAULT '匿名' COMMENT '学生姓名',
`Ssex` varchar(2) NOT NULL DEFAULT '男' COMMENT '学生性别',
`birthday` datetime DEFAULT NULL COMMENT '生日',
`address` varchar(100) DEFAULT NULL COMMENT '家庭地址',
`Email` varchar(50) DEFAULT NULL COMMENT '电子邮箱',
`gradeid` int(10) NOT NULL COMMENT '学生所在年级',
PRIMARY KEY (`id`),
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `Grade` (`gradeid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
其中
KEY `FK_gradeid` (`gradeid`),
CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `Grade` (`gradeid`)
也可直接写为
FOREIGN KEY `FK_gradeid` (`gradeid`) REFERENCES `Grade` (`gradeid`)
删除有外键关系的表(被参照关系)时,必须先删除外键或删除参照关系,才可以删除该表。
删除外键的语句
ALTER TABLE `Student` DROP FOREIGN KEY `FK_gradeid`;
删除表
DROP TABLE IF EXISTS `Grade`;
方法二:创建表成功以后,添加外键约束
ALTER TABLE `Student` ADD CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `Grade`(`gradeid`);
或
ALTER TABLE `Student` ADD FOREIGN KEY `FK_gradeid`(`gradeid`) REFERENCES `Grade`(`gradeid`);
以上操作都是物理外键,数据库级别的外键,不建议使用(避免数据库过多而造成影响)。
最佳方法:
- 数据库就是单纯的表(关系),只用来存放行(元组)和列(属性)
- 我们想使用其他表的数据,想使用外键,用程序去实现(在应用层去实现,否则每次更新数据都得考虑级联)。