在使用MySQL數(shù)據(jù)庫(kù)時(shí),編寫一些復(fù)雜的查詢語(yǔ)句是很常見的。為了增加數(shù)據(jù)庫(kù)操作的效率,一般不會(huì)將多個(gè)查詢語(yǔ)句分開執(zhí)行,而是將它們放到同一個(gè)字符串中,用分號(hào)“;”來分隔每個(gè)語(yǔ)句。
然而,在實(shí)際操作過程中,我們會(huì)發(fā)現(xiàn),當(dāng)我們?cè)诳蛻舳溯斎攵鄠€(gè)查詢語(yǔ)句時(shí),會(huì)出現(xiàn)一些問題。例如,當(dāng)我們?cè)诿钚写翱谳斎攵鄠€(gè)語(yǔ)句進(jìn)行查詢時(shí),只有第一條語(yǔ)句會(huì)被執(zhí)行,其他語(yǔ)句則被忽略。這是因?yàn)樵贛ySQL數(shù)據(jù)庫(kù)中,分號(hào)“;”被視為語(yǔ)句結(jié)束符。
為了解決這個(gè)問題,MySQL引入了另外一種語(yǔ)句結(jié)束符——結(jié)束符(delimiter)。結(jié)束符是MySQL為客戶端提供的,用于將普通語(yǔ)句與存儲(chǔ)過程、函數(shù)、觸發(fā)器等復(fù)雜語(yǔ)句區(qū)分開來的語(yǔ)句結(jié)束符。當(dāng)MySQL解析器遇到結(jié)束符時(shí),它會(huì)將接下來的輸入作為一個(gè)整體處理,直到再次遇到結(jié)束符,然后將整個(gè)字符串作為一個(gè)語(yǔ)句進(jìn)行執(zhí)行。
delimiter // CREATE PROCEDURE GetAllUsers() BEGIN SELECT * FROM user; SELECT * FROM user_detail; END//
在上面的示例中,我們使用了結(jié)束符“//”來代替普通的分號(hào)“;”,并且在存儲(chǔ)過程中使用了多個(gè)查詢語(yǔ)句。在執(zhí)行時(shí),MySQL解析器會(huì)將整個(gè)字符串作為一個(gè)語(yǔ)句進(jìn)行處理。
需要注意的是,在存儲(chǔ)過程、函數(shù)、觸發(fā)器等復(fù)雜語(yǔ)句中,不能使用分號(hào)“;”作為語(yǔ)句結(jié)束符,否則會(huì)引起語(yǔ)法錯(cuò)誤。但在應(yīng)用程序中使用MySQL API時(shí),仍然需要使用分號(hào)“;”來區(qū)分每個(gè)語(yǔ)句。