SQLyog中DELIMITER執(zhí)行存儲(chǔ)過(guò)程時(shí)出現(xiàn)前置縮進(jìn)問(wèn)題的解決方法
問(wèn)題根源
SQLyog的語(yǔ)句分隔邏輯:
SQLyog默認(rèn)會(huì)根據(jù)分號(hào)(
;)和換行自動(dòng)分隔SQL語(yǔ)句當(dāng)代碼有縮進(jìn)時(shí),SQLyog可能錯(cuò)誤地將縮進(jìn)后的內(nèi)容識(shí)別為新的SQL語(yǔ)句
DELIMITER的敏感性:
DELIMITER //命令必須獨(dú)立一行且無(wú)前導(dǎo)空格任何縮進(jìn)都會(huì)導(dǎo)致SQLyog將其視為普通文本而非指令
存儲(chǔ)過(guò)程體內(nèi)的語(yǔ)句:
過(guò)程體內(nèi)的縮進(jìn)不會(huì)影響執(zhí)行(因?yàn)槭亲鳛檎w解析)
但過(guò)程體外的命令(如DELIMITER)必須無(wú)縮進(jìn)
正確寫(xiě)法示例
-- 必須頂格寫(xiě)(無(wú)縮進(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//
-- 必須頂格寫(xiě)(無(wú)縮進(jìn))
DELIMITER ;永久解決方案
關(guān)閉SQLyog的自動(dòng)分隔功能:
菜單欄 → 工具 → 首選項(xiàng) → 查詢編輯器
取消勾選"自動(dòng)分隔SQL語(yǔ)句"
使用批處理執(zhí)行模式:
全選所有代碼(包括DELIMITER)
按
Ctrl+Shift+F9(批處理執(zhí)行)而非普通執(zhí)行
檢查編輯器設(shè)置:
確保沒(méi)有開(kāi)啟"智能縮進(jìn)"或"語(yǔ)法感知縮進(jìn)"功能
為什么命令行不受影響?
MySQL原生命令行客戶端:
完全依賴DELIMITER指令
不關(guān)心縮進(jìn)和格式
直到遇到定義的結(jié)束符(如//)才會(huì)執(zhí)行
而SQLyog等圖形工具為提高易用性,會(huì)嘗試自動(dòng)解析SQL結(jié)構(gòu),導(dǎo)致對(duì)格式敏感。
最佳實(shí)踐建議
存儲(chǔ)過(guò)程創(chuàng)建語(yǔ)句建議:
DELIMITER和END//必須頂格
過(guò)程體內(nèi)的縮進(jìn)保持一致性(4空格或1個(gè)tab)
復(fù)雜過(guò)程建議:
-- 頂格
DELIMITER //
CREATE PROCEDURE proc_name()
BEGIN
-- 縮進(jìn)內(nèi)容
SELECT * FROM table;
END//
-- 頂格
DELIMITER ;保存為腳本文件后通過(guò)命令行執(zhí)行:
mysql -u user -p db_name < procedure.sql
到此這篇關(guān)于SQLyog中DELIMITER執(zhí)行存儲(chǔ)過(guò)程時(shí)出現(xiàn)的前置縮進(jìn)問(wèn)題的解決方法的文章就介紹到這了,更多相關(guān)SQLyog DELIMITER出現(xiàn)前置縮進(jìn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用innodb_force_recovery解決MySQL崩潰無(wú)法重啟問(wèn)題
這篇文章主要介紹了使用innodb_force_recovery解決MySQL崩潰無(wú)法重啟問(wèn)題,這只一個(gè)成功案例,并不是萬(wàn)能的解決方法,需要酌情考慮,需要的朋友可以參考下2015-05-05
MySQL數(shù)據(jù)庫(kù)中刪除重復(fù)記錄簡(jiǎn)單步驟
這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)中刪除重復(fù)記錄的相關(guān)資料,在使用數(shù)據(jù)庫(kù)時(shí),出現(xiàn)重復(fù)數(shù)據(jù)是常有的情況,但有些情況是允許數(shù)據(jù)重復(fù)的,而有些情況是不允許的,當(dāng)出現(xiàn)不允許的情況,我們就需要對(duì)重復(fù)數(shù)據(jù)進(jìn)行刪除處理,需要的朋友可以參考下2023-08-08
mysql 5.7 數(shù)據(jù)庫(kù)安裝步驟個(gè)人總結(jié)
這篇文章主要介紹了mysql 數(shù)據(jù)庫(kù)安裝步驟個(gè)人總結(jié),需要的朋友可以參考下2017-09-09
IOS 數(shù)據(jù)庫(kù)升級(jí)數(shù)據(jù)遷移的實(shí)例詳解
這篇文章主要介紹了IOS 數(shù)據(jù)庫(kù)升級(jí)數(shù)據(jù)遷移的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例幫助大家解決數(shù)據(jù)庫(kù)升級(jí)及數(shù)據(jù)遷移的問(wèn)題,需要的朋友可以參考下2017-07-07
實(shí)現(xiàn)數(shù)據(jù)庫(kù)水平切分的兩個(gè)思路
今天小編就為大家分享一篇關(guān)于實(shí)現(xiàn)數(shù)據(jù)庫(kù)水平切分的兩個(gè)思路,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
MySQL8.0.21.0社區(qū)版安裝教程(圖文詳解)
這篇文章主要介紹了MySQL8.0.21.0社區(qū)版安裝教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
MySQL NDB Cluster關(guān)于Nginx stream的負(fù)載均衡配置方式
這篇文章主要介紹了MySQL NDB Cluster關(guān)于Nginx stream的負(fù)載均衡配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
mysql中復(fù)制表結(jié)構(gòu)的方法小結(jié)
這篇文章主要介紹了mysql中復(fù)制表結(jié)構(gòu)的方法,需要的朋友可以參考下2014-07-07

