MySQL存储过程中的IF是过程式语句,必须在BEGIN…END内使用IF condition THEN…ELSEIF…ELSE…END IF;结构,每行末及END IF后均需分号,ELSEIF不可有空格,NULL须用IS NULL显式判断,浮点比较宜用ABS(a-b)。

MySQL 存储过程里的 IF 是过程式语句,不是函数,写错位置或漏掉结构就会直接报错 ERROR 1064 或 ERROR 1339。
MySQL 存储过程中 IF 必须成对出现且带分号
它只能出现在 BEGIN ... END 块内,语法是 IF condition THEN ... END IF;,末尾的分号不能省——这是 MySQL 特有要求,和其他数据库不同。
-
END IF;必须写全,不能写成ENDIF或ENDIF; - 每个分支内部的语句末尾也要加分号,比如
SET @x = 1;、SELECT 'ok'; - 嵌套时每一层都要有自己的
END IF;,漏一个就语法报错 - 别把
IF(status=1, 'Y', 'N')这种表达式函数混进来——它只能用在SELECT或SET里返回值,不能控制流程
条件里 NULL 要显式判断,别用 = NULL
= NULL 永远返回 FALSE,MySQL 的三值逻辑下,NULL 只能用 IS NULL 或 IS NOT NULL 判断。
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
- 错误写法:
IF @val = NULL THEN ... - 正确写法:
IF @val IS NULL THEN ...或IF @val IS NOT NULL THEN ... - 多个条件组合时,
AND/OR优先级容易出错,建议加括号:IF (@a > 0 AND @b IS NOT NULL) THEN ...
多分支用 ELSEIF,不是 ELIF 或 ELSE IF
MySQL 不支持缩写,必须写全 ELSEIF(中间无空格),且所有分支共用一个 END IF;。
- 正确:
ELSEIF @status = 2 THEN ... - 错误:
ELIF @status = 2 THEN ...或ELSE IF @status = 2 THEN ...(后者会被解析为ELSE后跟独立的IF,逻辑错乱) - 如果所有
WHEN都不匹配又没写ELSE,运行时会报ERROR 1339 (42000): Case not found for CASE statement——注意这个错误码也适用于IF结构未兜底的情况
浮点比较要小心,别直接用 = 判断
存储过程里变量如果是 DECIMAL 或计算得来的浮点值,直接 = 容易因精度丢失失败。
- 安全写法:
IF ABS(@a - @b) - 或者转成整数比较:
IF ROUND(@a * 100) = ROUND(@b * 100) THEN ... - 字符串比较要注意大小写和空格,
TRIM(UPPER(@str)) = 'YES'更可靠
最容易被忽略的是:MySQL 的 IF 只能在存储过程、函数、触发器里用,不能塞进普通查询或视图定义中;另外,DELIMITER 必须提前改,否则 ; 会让 MySQL 提前结束 CREATE 语句——这点一错整个过程就建不起来。

















