SQLyog中DELIMITER執(zhí)行存儲(chǔ)過程時(shí)出現(xiàn)前置縮進(jìn)問題的解決方法
問題根源
SQLyog的語句分隔邏輯:
SQLyog默認(rèn)會(huì)根據(jù)分號(hào)(
;)和換行自動(dòng)分隔SQL語句當(dāng)代碼有縮進(jìn)時(shí),SQLyog可能錯(cuò)誤地將縮進(jìn)后的內(nèi)容識(shí)別為新的SQL語句
DELIMITER的敏感性:
DELIMITER //命令必須獨(dú)立一行且無前導(dǎo)空格任何縮進(jìn)都會(huì)導(dǎo)致SQLyog將其視為普通文本而非指令
存儲(chǔ)過程體內(nèi)的語句:
過程體內(nèi)的縮進(jìn)不會(huì)影響執(zhí)行(因?yàn)槭亲鳛檎w解析)
但過程體外的命令(如DELIMITER)必須無縮進(jìn)
正確寫法示例
-- 必須頂格寫(無縮進(jìn))
DELIMITER //
CREATE PROCEDURE grant_role_to_all_users()
BEGIN
-- 這里面的縮進(jìn)不會(huì)影響執(zhí)行
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//
-- 必須頂格寫(無縮進(jìn))
DELIMITER ;永久解決方案
關(guān)閉SQLyog的自動(dòng)分隔功能:
菜單欄 → 工具 → 首選項(xiàng) → 查詢編輯器
取消勾選"自動(dòng)分隔SQL語句"
使用批處理執(zhí)行模式:
全選所有代碼(包括DELIMITER)
按
Ctrl+Shift+F9(批處理執(zhí)行)而非普通執(zhí)行
檢查編輯器設(shè)置:
確保沒有開啟"智能縮進(jìn)"或"語法感知縮進(jìn)"功能
為什么命令行不受影響?
MySQL原生命令行客戶端:
完全依賴DELIMITER指令
不關(guān)心縮進(jìn)和格式
直到遇到定義的結(jié)束符(如//)才會(huì)執(zhí)行
而SQLyog等圖形工具為提高易用性,會(huì)嘗試自動(dòng)解析SQL結(jié)構(gòu),導(dǎo)致對(duì)格式敏感。
最佳實(shí)踐建議
存儲(chǔ)過程創(chuàng)建語句建議:
DELIMITER和END//必須頂格
過程體內(nèi)的縮進(jìn)保持一致性(4空格或1個(gè)tab)
復(fù)雜過程建議:
-- 頂格
DELIMITER //
CREATE PROCEDURE proc_name()
BEGIN
-- 縮進(jìn)內(nèi)容
SELECT * FROM table;
END//
-- 頂格
DELIMITER ;保存為腳本文件后通過命令行執(zhí)行:
mysql -u user -p db_name < procedure.sql
到此這篇關(guān)于SQLyog中DELIMITER執(zhí)行存儲(chǔ)過程時(shí)出現(xiàn)的前置縮進(jìn)問題的解決方法的文章就介紹到這了,更多相關(guān)SQLyog DELIMITER出現(xiàn)前置縮進(jìn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL存儲(chǔ)過程的創(chuàng)建使用以及實(shí)現(xiàn)數(shù)據(jù)快速插入
因最近想要測試一下MySQL百萬級(jí)數(shù)據(jù)處理過程,所以要一次對(duì)數(shù)據(jù)庫快速插入大量數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于MySQL存儲(chǔ)過程的創(chuàng)建使用以及實(shí)現(xiàn)數(shù)據(jù)快速插入的相關(guān)資料,需要的朋友可以參考下2023-03-03
MySQL中count(*)深度解析與性能優(yōu)化實(shí)踐案例
這篇文章給大家介紹MySQL中count(*)深度解析與性能優(yōu)化實(shí)踐,本文將結(jié)合實(shí)際測試案例,從原理到實(shí)踐,帶你徹底搞懂count(*),并分享3種高效優(yōu)化count()性能的方案,感興趣的朋友跟隨小編一起看看吧2025-12-12
mysql實(shí)現(xiàn)本地keyvalue數(shù)據(jù)庫緩存示例
這篇文章主要介紹了代碼實(shí)現(xiàn)本地Key-Value緩存示例,大家參考使用吧2013-12-12
使用mysql事件調(diào)度器定時(shí)刪除binlog
MySQL5.1.6起Mysql增加了事件調(diào)度器(Event Scheduler),可以用做定時(shí)執(zhí)行某些特定任務(wù),來取代原先只能由操作系統(tǒng)的計(jì)劃任務(wù)來執(zhí)行的工作2014-03-03

