-- Migration: 新增全站统一上传文件表 files,并把 attachments 数据迁入(type='attachments') -- Date: 2026-08-28 -- Description: files 表用于管理全站所有上传文件(附件/头像/Logo 等), -- Type 字段区分归属类型;attachments 历史数据逐行复制,type 填 'attachments'。 -- 幂等:表用 IF NOT EXISTS,数据按主键 id 对齐跳过已迁移行,可重复执行。 -- 1) 建表(与 GORM AutoMigrate 输出一致) CREATE TABLE IF NOT EXISTS `files` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `type` varchar(32) DEFAULT 'attachments', `article_id` bigint(20) unsigned DEFAULT NULL, `session_token` varchar(64) DEFAULT NULL, `uploader_id` bigint(20) unsigned DEFAULT NULL, `filename` varchar(255) DEFAULT NULL, `stored_name` varchar(64) DEFAULT NULL, `ext` varchar(32) DEFAULT NULL, `mime` varchar(128) DEFAULT NULL, `size` bigint(20) DEFAULT 0, `category` varchar(32) DEFAULT NULL, `created_at` datetime(3) DEFAULT NULL, `updated_at` datetime(3) DEFAULT NULL, `deleted_at` datetime(3) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_files_type` (`type`), KEY `idx_files_article_id` (`article_id`), KEY `idx_files_session_token` (`session_token`), KEY `idx_files_uploader_id` (`uploader_id`), KEY `idx_files_stored_name` (`stored_name`), KEY `idx_files_deleted_at` (`deleted_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- 2) 数据迁移:attachments 全部行(含软删除)复制进 files,type='attachments' INSERT INTO `files` (`id`,`type`,`article_id`,`session_token`,`uploader_id`,`filename`,`stored_name`,`ext`,`mime`,`size`,`category`,`created_at`,`updated_at`,`deleted_at`) SELECT a.`id`, 'attachments', a.`article_id`, a.`session_token`, a.`uploader_id`, a.`filename`, a.`stored_name`, a.`ext`, a.`mime`, a.`size`, a.`category`, a.`created_at`, a.`updated_at`, a.`deleted_at` FROM `attachments` a WHERE NOT EXISTS (SELECT 1 FROM `files` f WHERE f.`id` = a.`id`);