Розмежувачі в MySQL


165

Я часто бачу, як люди використовують Delimiters. Я спробував себе з’ясувати, що таке роздільники і яке їх призначення. Після 20 хвилин гуглінгу я не зміг знайти відповідь, яка мене задовольняє. Отже, моє питання зараз: Що таке роздільники і коли я повинен їх використовувати?

Відповіді:


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 не працює з PhpMyAdmin SQL (принаймні, деякі версії). Натомість ви можете встановити роздільник у окремому полі для самого 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, як $$. Команда DELIMITER використовується для зміни стандартного роздільника команд MySQL (тобто;). Оскільки висловлювання в підпрограмах (функції, збережені процедури або тригери) закінчуються крапкою з двокрапкою (;), для трактування їх як складеного твердження ми використовуємо DELIMITER. Якщо не визначено при використанні різних процедур в одному файлі або командному рядку, це призведе до синтаксичної помилки.

Зауважте, що ви можете використовувати різні незарезервовані символи, щоб зробити свій власний роздільник. Вам слід уникати використання символу зворотної косої риски (\), тому що це символ втечі для 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
Ankur Kumar Singh

1

DELIMITER, щоб повідомити клієнту mysql, щоб він ставився до операторів, функцій, збережених процедур або тригерів як до цілого оператора. Зазвичай в а. Файл sql ви встановлюєте інший DELIMITER, як $$. Команда DELIMITER використовується для зміни стандартного роздільника команд MySQL


1

Розмежувач - це символ у SQL, який використовується для розділення елементів даних у базі даних. Він визначає початок і кінець символьного рядка. Як правило, роздільник, який використовується в SQL, - ';'.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.