# MySQL 语法错误修正说明 ## 问题原因 MySQL 的 `ALTER TABLE ADD COLUMN` 语法不支持 `IF NOT EXISTS`。 ### ❌ 错误语法 ```sql ALTER TABLE table_name ADD COLUMN IF NOT EXISTS tenant_id BIGINT NULL; ``` ### ✅ 正确语法 ```sql -- 使用动态 SQL 检查字段是否存在 SET @sql = (SELECT IF( COUNT(*) = 0, 'ALTER TABLE table_name ADD COLUMN tenant_id BIGINT NULL', 'SELECT ''字段已存在'' AS info' ) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'database_name' AND TABLE_NAME = 'table_name' AND COLUMN_NAME = 'tenant_id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; ``` ## 已修正的脚本 📄 **新的迁移脚本:** `tools/sql/add_all_tenant_id_fields.sql` ### 修正内容 1. ✅ 移除了所有 `IF NOT EXISTS`(ALTER TABLE 不支持) 2. ✅ 使用动态 SQL + PREPARE/EXECUTE 实现条件添加 3. ✅ 如果字段已存在,会显示信息但不报错 4. ✅ CREATE INDEX 仍使用 `IF NOT EXISTS`(MySQL 8.0 支持) ### 脚本特性 - ✅ 安全:不会重复添加字段 - ✅ 智能:自动检查字段是否存在 - ✅ 完整:包含所有 24 张业务表 - ✅ 验证:自动验证添加结果 ## 🚀 重新执行脚本 ### 使用数据库管理工具(推荐) 1. 打开您的数据库管理工具(Navicat/HeidiSQL/DBeaver) 2. 连接到 `aidopdev` 数据库 3. 打开文件:`d:\DEMONET\tools\sql\add_all_tenant_id_fields.sql` 4. 全选并执行 ### 使用 MySQL 命令行 ```bash mysql -u root -p # 输入密码后: USE aidopdev; source d:/DEMONET/tools/sql/add_all_tenant_id_fields.sql ``` ### 使用命令行直接执行 ```bash mysql -u root -p aidopdev < d:\DEMONET\tools\sql\add_all_tenant_id_fields.sql ``` ## ✅ 执行后会看到 脚本执行过程中会显示: - 每个表的处理状态(添加成功 或 已存在) - 最后显示验证结果 - 显示添加的表数量统计 ## 📊 验证查询 执行完成后,手动验证: ```sql -- 查看有多少表添加了 tenant_id SELECT COUNT(DISTINCT TABLE_NAME) AS 表数量 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'aidopdev' AND COLUMN_NAME = 'tenant_id'; -- 查看具体哪些表有 tenant_id SELECT TABLE_NAME AS 表名 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'aidopdev' AND COLUMN_NAME = 'tenant_id' ORDER BY TABLE_NAME; ``` ## 🎯 预期结果 执行成功后应该看到约 **24+ 张表** 有 tenant_id 字段。 --- 修正时间:2026-04-22 问题:MySQL ALTER TABLE 不支持 IF NOT EXISTS 解决方案:使用动态 SQL + PREPARE/EXECUTE