Разделители в MySQL

166

Я часто вижу, что люди используют разделители. Я попытался выяснить, что такое разделители и какова их цель. После 20 минут поиска в Google я не смог найти ответ, который меня устраивал. Итак, мой вопрос сейчас: что такое разделители и когда я должен их использовать?

System.Data
источник

Ответы:

246

Разделители, отличные от значений по умолчанию ;, обычно используются при определении функций, хранимых процедур и триггеров, в которых необходимо определить несколько операторов. Вы определяете другой разделитель, например, $$который используется для определения конца всей процедуры, но внутри него отдельные операторы заканчиваются на ;. Таким образом, когда код запускается на 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, для правильного синтаксиса, чтобы использовать рядом с 'DELIMITER $$' в строке 1

Майкл Берковски
источник
3
В каких сценариях имеет смысл использовать разделитель? Я действительно не получил это.
System.Data
2
@ System.Data Первое предложение моего ответа - при определении хранимых процедур, пользовательских функций и триггеров. Каждый раз, когда несколько операторов выполняются как единое целое в командной строке MySQL.
Майкл Берковски
2
Обратите внимание, что команда DELIMITER не работает с SQL PhpMyAdmin (по крайней мере, некоторые версии). Вместо этого вы можете установить разделитель в отдельном поле для самого SQL. Это меня смутило довольно давно ... :-)
Сильно нерегулярно
1
@MichaelBerkowski, надеюсь, мы сможем сделать это в будущем.
Pacerier
1
@StockB Этот ответ на самом деле не о том, почему хранимые процедуры полезны, упоминание «одного модуля» относится к тому, как MySQL сможет интерпретировать SP при его синтаксическом анализе: найти границы модуля по разделителю, а затем проанализировать отдельные операторы внутри. Но поскольку вы спросили, использование SP с несколькими операторами позволит вам скрыть детали реализации от приложения, вызывающего SP. Код приложения не должен заботиться о том, что выполняется SQL (и вы можете изменить его при необходимости), если он возвращает согласованный результат. Как функция в коде.
Майкл Берковски
21

Оператор DELIMITER меняет стандартный разделитель, который является точкой с запятой (;), на другой. Разделитель меняется с точки с запятой (;) на двойную косую черту //.

Почему мы должны изменить разделитель?

Потому что мы хотим передать хранимую процедуру, пользовательские функции и т. Д. На сервер в целом, а не позволять инструменту mysql интерпретировать каждый оператор за раз.

Прадип Сингх
источник
13

Когда вы создаете хранимую подпрограмму с BEGIN...ENDблоком, операторы внутри блока заканчиваются точкой с запятой (;). Но CREATE PROCEDUREутверждение также нуждается в терминаторе. Таким образом, становится неясным, заканчивается ли точка с запятой в теле процедуры CREATE PROCEDUREили завершает одно из утверждений в теле процедуры.

Способ устранения неоднозначности состоит в объявлении отдельной строки (которая не должна встречаться в теле процедуры), которую клиент MySQL распознает как истинный терминатор для CREATE PROCEDUREоператора.

Ризван Ахмед
источник
1
Это лучший ответ, потому что он указывает правильную причину использовать DELIMITER самым простым способом и не вызывая путаницы. Спасибо
Фахар Анвар
6

Разделитель - это символ или строка символов, которые вы будете использовать, чтобы сообщить клиенту MySQL, что вы закончили вводить оператор Sql.

Каумади Кариявасам
источник
5

Вы определяете DELIMITER, чтобы сказать клиенту mysql обрабатывать операторы, функции, хранимые процедуры или триггеры как весь оператор. Обычно в файле .sql вы устанавливаете другой разделитель, например $$. Команда DELIMITER используется для изменения стандартного разделителя команд MySQL (т.е.;). Так как операторы внутри подпрограмм (функций, хранимых процедур или триггеров) заканчиваются точкой с запятой (;), для обработки их как составного оператора мы используем DELIMITER. Если не определено при использовании различных подпрограмм в одном файле или командной строке, это приведет к синтаксической ошибке.

Обратите внимание, что вы можете использовать различные незарезервированные символы, чтобы создать свой собственный разделитель. Вам следует избегать использования символа обратной косой черты (\), потому что это escape-символ для MySQL.

DELIMITER на самом деле не команда языка 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. Для более подробной информации, пожалуйста, обратитесь к последнему разделу моего урока techflirt.com/mysql-stored-procedure-tutorial
Кумар Сингх,
1

DELIMITER для указания клиенту mysql обрабатывать операторы, функции, хранимые процедуры или триггеры как целостный оператор. Обычно в. Файл sql вы устанавливаете другой разделитель, как $$. Команда DELIMITER используется для изменения стандартного разделителя команд MySQL.

Виханга Сахан
источник
1

Разделитель - это символ в SQL, который используется для разделения элементов данных в базе данных. Он идентифицирует начало и конец строки символов. Обычно в SQL используется разделитель ';'.

Венусара Каппетиж
источник