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_id
是 folders.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
有关系,是因为有外键:
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
的表,一般用于保存文件记录。
`id` int NOT NULL AUTO_INCREMENT,
int
类型,不能为 NULL
。AUTO_INCREMENT
表示插入新记录时自动递增。 `folder_id` int DEFAULT NULL,
int
。NULL
(允许没有目录)。folders.id
建立外键关系(见后面)。 `name` varchar(255) NOT NULL,
NULL
。 `file_type` varchar(20) DEFAULT NULL,
image
、video
、text
。 `mime_type` varchar(100) DEFAULT NULL,
image/png
、application/pdf
。 `size` bigint DEFAULT NULL,
bigint
可支持超过 2GB 的文件大小。 `url` text,
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`),
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_id → folders.id |
自动时间维护 | uploaded_at 、updated_at |
适配大文件 | bigint 存储 size |
支持 UUID | uploader_id 长度为 36 |
字符集现代 | utf8mb4 + ai_ci 排序,适合国际化 |
删除同步 | ON DELETE CASCADE 自动清除孤立文件 |