SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

 更新时间:2025年05月03日 09:40:42   作者:星途码客  
在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详细解释和解决方案,需要的朋友可以参考下

问题根源

  1. SQLyog的语句分隔逻辑

    • SQLyog默认会根据分号(;)和换行自动分隔SQL语句

    • 当代码有缩进时,SQLyog可能错误地将缩进后的内容识别为新的SQL语句

  2. DELIMITER的敏感性

    • DELIMITER //命令必须独立一行且无前导空格

    • 任何缩进都会导致SQLyog将其视为普通文本而非指令

  3. 存储过程体内的语句

    • 过程体内的缩进不会影响执行(因为是作为整体解析)

    • 但过程体外的命令(如DELIMITER)必须无缩进

正确写法示例

-- 必须顶格写(无缩进)
DELIMITER //
CREATE PROCEDURE grant_role_to_all_users()
BEGIN
    -- 这里面的缩进不会影响执行
    DECLARE finished INTEGER DEFAULT 0;
    DECLARE user_host VARCHAR(255);
    
    DECLARE user_cursor CURSOR FOR 
        SELECT CONCAT('`',USER,'`@`',HOST,'`') 
        FROM mysql.user 
        WHERE USER NOT IN ('root','mysql.sys','mysql.session','mysql.infoschema');
    
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
    
    OPEN user_cursor;
    
    get_user: LOOP
        FETCH user_cursor INTO user_host;
        IF finished = 1 THEN LEAVE get_user; END IF;
        
        SET @grant_sql = CONCAT('GRANT "public_role" TO ', user_host);
        PREPARE stmt FROM @grant_sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        
        SET @default_sql = CONCAT('SET DEFAULT ROLE "public_role" FOR ', user_host);
        PREPARE stmt FROM @default_sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END LOOP get_user;
    
    CLOSE user_cursor;
END//
-- 必须顶格写(无缩进)
DELIMITER ;

永久解决方案

  1. 关闭SQLyog的自动分隔功能

    • 菜单栏 → 工具 → 首选项 → 查询编辑器

    • 取消勾选"自动分隔SQL语句"

  2. 使用批处理执行模式

    • 全选所有代码(包括DELIMITER)

    • 按 Ctrl+Shift+F9(批处理执行)而非普通执行

  3. 检查编辑器设置

    • 确保没有开启"智能缩进"或"语法感知缩进"功能

为什么命令行不受影响?

MySQL原生命令行客户端:

  • 完全依赖DELIMITER指令

  • 不关心缩进和格式

  • 直到遇到定义的结束符(如//)才会执行

而SQLyog等图形工具为提高易用性,会尝试自动解析SQL结构,导致对格式敏感。

最佳实践建议

  1. 存储过程创建语句建议:

    • DELIMITER和END//必须顶格

    • 过程体内的缩进保持一致性(4空格或1个tab)

  2. 复杂过程建议:

-- 顶格
DELIMITER //
CREATE PROCEDURE proc_name()
BEGIN
    -- 缩进内容
    SELECT * FROM table;
END//
-- 顶格
DELIMITER ;

保存为脚本文件后通过命令行执行:

mysql -u user -p db_name < procedure.sql

到此这篇关于SQLyog中DELIMITER执行存储过程时出现的前置缩进问题的解决方法的文章就介绍到这了,更多相关SQLyog DELIMITER出现前置缩进内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL存储过程的创建使用以及实现数据快速插入

    MySQL存储过程的创建使用以及实现数据快速插入

    因最近想要测试一下MySQL百万级数据处理过程,所以要一次对数据库快速插入大量数据,下面这篇文章主要给大家介绍了关于MySQL存储过程的创建使用以及实现数据快速插入的相关资料,需要的朋友可以参考下
    2023-03-03
  • MySQL中count(*)深度解析与性能优化实践案例

    MySQL中count(*)深度解析与性能优化实践案例

    这篇文章给大家介绍MySQL中count(*)深度解析与性能优化实践,本文将结合实际测试案例,从原理到实践,带你彻底搞懂count(*),并分享3种高效优化count()性能的方案,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • MySQL约束条件及设置方式

    MySQL约束条件及设置方式

    文章主要介绍了数据库中约束条件的设置,包括主键约束、自增约束、非空约束、唯一性约束、无符合约束、默认约束和外键约束,以及如何在数据库中设置这些约束条件
    2025-01-01
  • mysql实现本地keyvalue数据库缓存示例

    mysql实现本地keyvalue数据库缓存示例

    这篇文章主要介绍了代码实现本地Key-Value缓存示例,大家参考使用吧
    2013-12-12
  • Navicat工具中设置MySQL允许外部访问

    Navicat工具中设置MySQL允许外部访问

    默认情况下MySQL只允许本地登录,即只能在安装MySQL环境所在的主机下访问,这篇文章主要给大家介绍了关于Navicat工具中设置MySQL允许外部访问的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • 讲解MySQL中<=>操作符的用法

    讲解MySQL中<=>操作符的用法

    这篇文章主要介绍了讲解MySQL中<=>操作符的用法,整理自stackoverflow的相关实际问题,需要的朋友可以参考下
    2015-04-04
  • MySQL复制问题的三个参数分析

    MySQL复制问题的三个参数分析

    这篇文章主要介绍了MySQL复制问题的三个参数分析,帮助大家更好的理解和学习使用MySQL数据库,感兴趣的朋友可以了解下
    2021-04-04
  • 使用mysql事件调度器定时删除binlog

    使用mysql事件调度器定时删除binlog

    MySQL5.1.6起Mysql增加了事件调度器(Event Scheduler),可以用做定时执行某些特定任务,来取代原先只能由操作系统的计划任务来执行的工作
    2014-03-03
  • Windows10下安装解压版MySQL教程图文详解

    Windows10下安装解压版MySQL教程图文详解

    MySQL安装分为安装版和解压版,安装版主要是由一个exe程序式安装,有界面鼠标点击安装即可,这篇文章主要介绍了Windows10下安装解压版MySQL教程,需要的朋友可以参考下
    2019-09-09
  • MySql中的索引失效、回表解析问题

    MySql中的索引失效、回表解析问题

    这篇文章主要介绍了MySql中的索引失效、回表解析问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05

最新评论