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



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

1576   5  

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

    Ничего не найдено.