外键(了解即可)

我帮你把这份 MySQL 外键笔记 整理成清爽、规范、可直接复制到笔记软件的美化版 Markdown,结构更清晰、重点更突出:


外键(Foreign Key)

了解即可,实际开发不推荐使用数据库物理外键

一、基本概念

  • 外键:用于建立主表从表之间的关联,保证数据的参照完整性。
  • 主表:被引用的表(如 grade 年级表)。
  • 从表:引用别人的表(如 student 学生表)。

二、方式一:创建表时直接添加外键(复杂)

1. 先创建主表 grade

CREATE TABLE IF NOT EXISTS `grade`(
  `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
  `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
  PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

2. 再创建从表 student,并定义外键

CREATE TABLE IF NOT EXISTS `student`(
  `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
  `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
  `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
  `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
  `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
  `gradeid` INT(10) NOT NULL COMMENT '学生的年级',
  `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
  `email` VARCHAR(50) DEFAULT 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`)

三、注意事项

  • 有外键关联时,不能直接删除主表
  • 删除顺序:
    1. 先删 从表(引用别人的表)
    2. 再删 主表(被引用的表)

四、方式二:创建表后追加外键(推荐写法)

1. 先分别创建两张表(无外键)

-- 主表
CREATE TABLE IF NOT EXISTS `grade`(
  `gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
  `gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
  PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

-- 从表
CREATE TABLE IF NOT EXISTS `student`(
  `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
  `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
  `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
  `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
  `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
  `gradeid` INT(10) NOT NULL COMMENT '学生的年级',
  `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
  `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

2. 使用 ALTER 添加外键

通用公式

ALTER TABLE `从表名`
ADD CONSTRAINT `约束名` FOREIGN KEY(`外键列`) REFERENCES `主表名`(`主表列`);

示例

ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);

五、重要结论(必看)

以上都是 物理外键(数据库级外键)

❌ 不建议使用

  • 会让数据库关系变得复杂
  • 影响性能、扩展性差

✅ 最佳实践

  1. 数据库只负责存数据,不做关联约束。
  2. 外键逻辑在代码/业务层实现

posted @ 2026-04-09 00:46  果子同志  阅读(11)  评论(0)    收藏  举报