MYSQL_SYNTAX_FIX.md 2.5 KB

MySQL 语法错误修正说明

问题原因

MySQL 的 ALTER TABLE ADD COLUMN 语法不支持 IF NOT EXISTS

❌ 错误语法

ALTER TABLE table_name 
ADD COLUMN IF NOT EXISTS tenant_id BIGINT NULL;

✅ 正确语法

-- 使用动态 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 命令行

mysql -u root -p
# 输入密码后:
USE aidopdev;
source d:/DEMONET/tools/sql/add_all_tenant_id_fields.sql

使用命令行直接执行

mysql -u root -p aidopdev < d:\DEMONET\tools\sql\add_all_tenant_id_fields.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