Разделители в MySQL
Я часто вижу, что люди используют разделители. Я попытался сам выяснить, что такое разделители и какова их цель. После 20 минут поиска в Интернете я не смог найти ответ, который меня удовлетворяет. Итак, теперь мой вопрос: Что такое разделители и когда я должен их использовать?
5 ответов:
разделители, отличные от стандартных
;обычно используются при определении функций, хранимых процедур и триггеров, в которых необходимо определить несколько операторов. Вы определяете другой разделитель, например$$который используется для определения конца всей процедуры, но внутри него отдельные операторы завершаются;. Таким образом, когда код выполняется вmysqlклиент, клиент может сказать, где заканчивается вся процедура и выполнить ее как единое целое, а не выполнение отдельных операторов внутри.отметим, что
DELIMITERключевое слово является функцией командной строкиmysqlклиент (и некоторые другие клиенты) только и не обычная функция языка MySQL. Это не сработает, если вы попытаетесь передать его через API языка программирования в MySQL. Некоторые другие клиенты, такие как PHPMyAdmin, имеют другие методы для указания разделителя не по умолчанию.пример:
DELIMITER $$ /* This is a complete statement, not part of the procedure, so use the custom delimiter $$ */ DROP PROCEDURE my_procedure$$ /* Now start the procedure code */ CREATE PROCEDURE my_procedure () BEGIN /* Inside the procedure, individual statements terminate with ; */ CREATE TABLE tablea ( col1 INT, col2 INT ); INSERT INTO tablea SELECT * FROM table1; CREATE TABLE tableb ( col1 INT, col2 INT ); INSERT INTO tableb SELECT * FROM table2; /* whole procedure ends with the custom delimiter */ END$$ /* Finally, reset the delimiter to the default ; */ DELIMITER ;пытается использовать
DELIMITERС клиентом, который не поддерживает это приведет к его отправке на сервер, который сообщит о синтаксической ошибке. Например, с помощью PHP и MySQLi:$mysqli = new mysqli('localhost', 'user', 'pass', 'test'); $result = $mysqli->query('DELIMITER $$'); echo $mysqli->error;ошибки:
у вас ошибка в вашем синтаксисе SQL; проверьте руководство, которое соответствует для вашей версии сервера MySQL для правильного синтаксиса использовать рядом с "разделителем $ $" в строке 1
оператор DELIMITER изменяет стандартный разделитель, который является точкой с запятой ( ;) на другой. Разделитель изменяется с точки с запятой (;) на двойную косую черту //.
Почему мы должны изменить разделитель?
потому что мы хотим передать хранимые процедуры, пользовательские функции и т. д. к серверу в целом, а не позволяя инструменту mysql интерпретировать каждый оператор за раз.
при создании хранимой процедуры, которая имеет
BEGIN...ENDблок, операторы внутри блока завершаются точкой с запятой(;). Но этоCREATE PROCEDUREоператор также нуждается в Терминаторе. Таким образом, становится неясным, завершается ли точка с запятой в теле процедурыCREATE PROCEDURE, или завершает один из операторов в теле процедуры.способ устранения неоднозначности заключается в объявлении отдельной строки (которая не должна встречаться в теле процедуры), которая клиент MySQL распознает как истинный Терминатор для
CREATE PROCEDUREзаявление.
вы определяете разделитель, чтобы сказать клиенту mysql обрабатывать операторы, функции, хранимые процедуры или триггеры как весь оператор. Обычно в а .sql-файл вы устанавливаете другой разделитель, например $$. Команда DELIMITER используется для изменения стандартного разделителя команд MySQL (т. е. ;). Поскольку операторы в подпрограммах (функции, хранимые процедуры или триггеры) заканчиваются точкой с запятой (;), чтобы рассматривать их как составной оператор мы используем разделитель. Если не определено при использовании различные процедуры в одном файле или в командной строке, это даст синтаксическую ошибку.
обратите внимание, что вы можете использовать различные незарезервированных символов, чтобы сделать свой собственный разделитель. Вы должны избегать использования символа обратной косой черты ( \ ), потому что это escape-символ для MySQL.
разделитель на самом деле не является командой языка MySQL, это команда клиента.
пример
DELIMITER $$ /*This is treated as a single statement as it ends with $$ */ DROP PROCEDURE IF EXISTS `get_count_for_department`$$ /*This routine is a compound statement. It ends with $$ to let the mysql client know to execute it as a single statement.*/ CREATE DEFINER=`student`@`localhost` PROCEDURE `get_count_for_department`(IN the_department VARCHAR(64), OUT the_count INT) BEGIN SELECT COUNT(*) INTO the_count FROM employees where department=the_department; END$$ /*DELIMITER is set to it's default*/ DELIMITER ;
разделитель-это символ или строка символов, которые вы будете использовать, чтобы сообщить клиенту MySQL, что вы закончили вводить инструкцию Sql.
Comments