Mysql数据库实现外键约束(Foreign Key Constraint),防止“孤儿数据”

files 表中对 folder_id 字段设置了 外键约束(Foreign Key Constraint),这个约束会强制:

files.folder_id 的值必须在 folders.id 表中存在,否则就不允许插入或更新。


举个例子:数据库结构

folders 表(父表)

id name
1 前端文件夹
2 后端文件夹

files 表(子表)

id folder_id name
1 1 index.js

外键关系:

files 表中存在这个语句(通过 SQL 或 ORM 建表时设置的):

FOREIGN KEY (folder_id) REFERENCES folders(id)

它的含义是:

  • folder_idfolders.id外键
  • 只有当 folders.id = 某个值 存在时,你才能把 files.folder_id = 某个值
  • 否则就会报错,防止“孤儿数据”出现

外键约束的目的

  • 保证数据一致性和完整性
  • 比如你不能说这个文件属于一个“根本不存在”的目录
  • 就像身份证的籍贯字段,必须是一个真实存在的省市,而不是随便填的字符串

所以你修改 files.folder_id,必须确保你填的 folder_id:

是存在于 folders.id 中的
否则就违反了外键约束,MySQL 报错(如你看到的 ERROR 1452


怎么查看外键关系?

你可以在 MySQL 中执行:

SHOW CREATE TABLE files\G

看一下类似于:

CONSTRAINT `files_ibfk_1` FOREIGN KEY (`folder_id`) REFERENCES `folders` (`id`) ON DELETE CASCADE

这就说明 files.folder_id 被强制关联到 folders.id


总结

你修改 files.folder_id 会与 folders.id 有关系,是因为有外键:

  • 优点:避免无效、错误的目录 ID
  • 缺点:操作时要注意目录是否真实存在

怎么样查两个表存在“外键约束”?

1. 查看 files 表的建表语句(推荐)

SHOW CREATE TABLE files\G

输出中如果包含这一段:

CONSTRAINT `files_ibfk_1` FOREIGN KEY (`folder_id`) REFERENCES `folders` (`id`)

就说明存在外键关系,files.folder_id 外键指向了 folders.id

例如:

SHOW CREATE TABLE files\G

输出:

mysql> SHOW CREATE TABLE files\G
*************************** 1. row ***************************
       Table: files
Create Table: CREATE TABLE `files` (
  `id` int NOT NULL AUTO_INCREMENT,
  `folder_id` int DEFAULT NULL,
  `name` varchar(255) NOT NULL,
  `file_type` varchar(20) DEFAULT NULL,
  `mime_type` varchar(100) DEFAULT NULL,
  `size` bigint DEFAULT NULL,
  `url` text,
  `uploaded_at` datetime DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `uploader_id` char(36) DEFAULT NULL,
  `uploader_name` varchar(100) DEFAULT NULL COMMENT '上传人姓名',
  PRIMARY KEY (`id`),
  KEY `folder_id` (`folder_id`),
  CONSTRAINT `files_ibfk_1` FOREIGN KEY (`folder_id`) REFERENCES `folders` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
***************************************************************

解释上部代码:

表头

CREATE TABLE `files` (

表示创建一个名为 files 的表,一般用于保存文件记录。


字段解析

1. 主键 ID
  `id` int NOT NULL AUTO_INCREMENT,
  • 主键字段。
  • int 类型,不能为 NULL
  • AUTO_INCREMENT 表示插入新记录时自动递增。
2. 文件所属目录 ID
  `folder_id` int DEFAULT NULL,
  • 表示文件属于哪个目录。
  • 类型是 int
  • 可为 NULL(允许没有目录)。
  • folders.id 建立外键关系(见后面)。
3. 文件名
  `name` varchar(255) NOT NULL,
  • 文件的名称,最长 255 个字符。
  • 不允许为 NULL
4. 文件类型(简写)
  `file_type` varchar(20) DEFAULT NULL,
  • 表示文件简化后的类型,比如 imagevideotext
  • 最大长度为 20 字符,可空。
5. MIME 类型(完整)
  `mime_type` varchar(100) DEFAULT NULL,
  • 标准 MIME 类型,如 image/pngapplication/pdf
  • 可空,最大 100 字符。
6. 文件大小
  `size` bigint DEFAULT NULL,
  • 文件大小(字节)。
  • bigint 可支持超过 2GB 的文件大小。
  • 可空。
7. 存储路径
  `url` text,
  • 文件的存储路径或下载地址。
  • 类型为 text,适合存储较长字符串。
8. 上传时间
  `uploaded_at` datetime DEFAULT CURRENT_TIMESTAMP,
  • 上传时的时间戳。
  • 默认值为当前时间(插入时自动填入)。
9. 更新时间
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  • 记录每次更新的时间。
  • 插入时默认当前时间,更新记录时自动更新时间
10. 上传人 ID
  `uploader_id` char(36) DEFAULT NULL,
  • 上传人 ID,通常为 UUID 格式。
  • 长度固定为 36 字符,可空。
11. 上传人姓名
  `uploader_name` varchar(100) DEFAULT NULL COMMENT '上传人姓名',
  • 上传人名字,最多 100 字符。
  • 可空,带有注释(方便文档说明)。

主键与索引

主键设置
  PRIMARY KEY (`id`),
  • 设置 id 为主键,唯一标识每一条记录。
索引
  KEY `folder_id` (`folder_id`),
  • folder_id 字段创建索引,加快根据目录 ID 查询文件的速度。

外键约束

  CONSTRAINT `files_ibfk_1` FOREIGN KEY (`folder_id`) REFERENCES `folders` (`id`) ON DELETE CASCADE
  • 外键约束,表示 files.folder_id 引用 folders.id
  • ON DELETE CASCADE如果某个目录被删除,所有在该目录下的文件也会自动删除
  • 用于保持数据一致性,防止“孤儿文件”

表配置

) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
  • ENGINE=InnoDB:使用支持事务、行级锁、外键的 InnoDB 引擎
  • AUTO_INCREMENT=37:当前 id 自动增长到了 37,下次插入从 37 开始
  • CHARSET=utf8mb4:支持 Emoji 的 UTF-8 字符集
  • COLLATE=utf8mb4_0900_ai_ci:排序规则,适合中文、英文同时使用,区分大小写和重音

总结

项目 说明
外键完整性 folder_idfolders.id
自动时间维护 uploaded_atupdated_at
适配大文件 bigint 存储 size
支持 UUID uploader_id 长度为 36
字符集现代 utf8mb4 + ai_ci 排序,适合国际化
删除同步 ON DELETE CASCADE 自动清除孤立文件

你可能感兴趣的:(Mysql数据库实现外键约束(Foreign Key Constraint),防止“孤儿数据”)