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

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

Ответ 1

Разделители, отличные от стандартного ;, обычно используются при определении функций, хранимых процедур и триггеров, в которых вы должны определить несколько операторов. Вы определяете другой разделитель, такой как $$, который используется для определения конца всей процедуры, но внутри него каждый оператор заканчивается на ;. Таким образом, когда код запускается в клиенте mysql, клиент может указать, где заканчивается вся процедура, и выполнять его как единицу, а не выполнять отдельные заявления внутри.

Обратите внимание, что ключевое слово DELIMITER является функцией только командной строки mysql client (и некоторых других клиентов), а не обычной функцией языка 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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

Вы определяете DELIMITER, чтобы сообщить клиенту mysql относиться к операторам, функциям, хранимым процедурам или триггерам как к целому утверждению. Обычно в файле .sql вы устанавливаете другой DELIMITER, например $$. Команда 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 default*/
DELIMITER ;

Ответ 5

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