Délimiteurs dans MySQL

166

Je vois souvent que les gens utilisent des délimiteurs. J'ai essayé de découvrir ce que sont les délimiteurs et quel est leur but. Après 20 minutes de recherche sur Google, je n'ai pas pu trouver de réponse qui me satisfasse. Donc, ma question est maintenant: Que sont les délimiteurs et quand dois-je les utiliser?

System.Data
la source

Réponses:

246

Délimiteurs autres que la valeur par défaut ;sont généralement utilisés lors de la définition des fonctions, des procédures stockées et déclencheurs dans laquelle vous devez définir plusieurs déclarations. Vous définissez un délimiteur différent, comme $$celui utilisé pour définir la fin de toute la procédure, mais à l'intérieur de celui-ci, les instructions individuelles se terminent chacune par ;. De cette façon, lorsque le code est exécuté dans le mysqlclient, le client peut dire où se termine la procédure entière et l'exécuter en tant qu'unité plutôt que d'exécuter les instructions individuelles à l'intérieur.

Notez que le DELIMITERmot-clé est mysqluniquement une fonction du client de ligne de commande (et de certains autres clients) et non une fonction de langage MySQL standard. Cela ne fonctionnera pas si vous essayez de le transmettre via une API de langage de programmation à MySQL. Certains autres clients comme PHPMyAdmin ont d'autres méthodes pour spécifier un délimiteur autre que celui par défaut.

Exemple:

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 ;

Toute tentative d'utilisation DELIMITERavec un client qui ne le prend pas en charge entraînera son envoi au serveur, ce qui signalera une erreur de syntaxe. Par exemple, en utilisant PHP et MySQLi:

$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$result = $mysqli->query('DELIMITER $$');
echo $mysqli->error;

Erreurs avec:

Vous avez une erreur dans votre syntaxe SQL; vérifiez le manuel qui correspond à votre version de serveur MySQL pour la bonne syntaxe à utiliser à côté de 'DELIMITER $$' à la ligne 1

Michael Berkowski
la source
3
Quels sont les scénarios où il est judicieux d'utiliser un délimiteur? Je n'ai pas vraiment compris.
System.Data
2
@ System.Data Première phrase de ma réponse - lors de la définition de procédures stockées, de fonctions personnalisées et de déclencheurs. Chaque fois que plusieurs instructions sont exécutées en tant qu'unité sur la ligne de commande MySQL.
Michael Berkowski
2
Notez que la commande DELIMITER ne fonctionne pas à partir d'un PhpMyAdmin SQL (au moins, certaines versions). Au lieu de cela, vous pouvez définir le délimiteur dans un champ séparé pour le SQL lui-même. Cela m'a confus pendant un certain temps ... :-)
Très irrégulier
1
@MichaelBerkowski, J'espère que nous trouverons un moyen de le faire à l'avenir.
Pacerier
1
@StockB Cette réponse ne portait pas vraiment sur les raisons pour lesquelles les procédures stockées sont bénéfiques, la mention "une unité" faisait référence à la façon dont MySQL serait capable d'interpréter le SP lors de son analyse: localiser les limites des unités par délimiteur, puis analyser les déclarations individuelles à l'intérieur. Mais comme vous l'avez demandé, l'utilisation d'un SP multi-instructions vous permettrait de masquer les détails d'implémentation de l'application appelant le SP. Le code d'application n'a pas besoin de se préoccuper de ce que SQL est exécuté (et vous pouvez le modifier si nécessaire) tant qu'il renvoie un résultat cohérent. Tout comme une fonction dans le code.
Michael Berkowski
21

L'instruction DELIMITER change le délimiteur standard qui est le point-virgule (;) en un autre. Le délimiteur passe du point-virgule (;) en double barre oblique //.

Pourquoi devons-nous changer le délimiteur?

Parce que nous voulons transmettre la procédure stockée, les fonctions personnalisées, etc. au serveur dans son ensemble plutôt que de laisser l'outil mysql interpréter chaque instruction à la fois.

Pradeep Singh
la source
13

Lorsque vous créez une routine stockée contenant un BEGIN...ENDbloc, les instructions dans le bloc se terminent par un point-virgule (;). Mais l' CREATE PROCEDUREinstruction a également besoin d'un terminateur. Il devient donc ambigu de savoir si le point-virgule dans le corps de la routine se termine CREATE PROCEDUREou termine l'une des instructions dans le corps de la procédure.

La manière de résoudre l'ambiguïté est de déclarer une chaîne distincte (qui ne doit pas apparaître dans le corps de la procédure) que le client MySQL reconnaît comme le véritable terminateur de l' CREATE PROCEDUREinstruction.

Rizwan Ahmed
la source
1
C'est la meilleure réponse car elle indique la bonne raison d'utiliser DELIMITER de la manière la plus simple et sans causer de confusion. Merci
Fakhar Anwar
6

Le délimiteur est le caractère ou la chaîne de caractères que vous utiliserez pour indiquer au client MySQL que vous avez fini de taper une instruction Sql.

Kaumadie Kariyawasam
la source
5

Vous définissez un DELIMITER pour indiquer au client mysql de traiter les instructions, les fonctions, les procédures stockées ou les déclencheurs comme une instruction entière. Normalement, dans un fichier .sql, vous définissez un DELIMITER différent comme $$. La commande DELIMITER est utilisée pour changer le délimiteur standard des commandes MySQL (ie;). Comme les instructions dans les routines (fonctions, procédures stockées ou déclencheurs) se terminent par un point-virgule (;), pour les traiter comme une instruction composée, nous utilisons DELIMITER. S'il n'est pas défini lors de l'utilisation de différentes routines dans le même fichier ou ligne de commande, cela donnera une erreur de syntaxe.

Notez que vous pouvez utiliser une variété de caractères non réservés pour créer votre propre délimiteur personnalisé. Vous devriez éviter d'utiliser le caractère anti-slash (\) car c'est le caractère d'échappement pour MySQL.

DELIMITER n'est pas vraiment une commande de langage MySQL, c'est une commande client.

Exemple

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 ;
Optimiseur
la source
Vous pouvez ajouter un délimiteur pour définir la plage de votre code de procédure mysql. Pour plus de détails, veuillez vous référer à la dernière section de mon tutoriel techflirt.com/mysql-stored-procedure-tutorial
Ankur Kumar Singh
1

DELIMITER pour dire au client mysql de traiter les instructions, les fonctions, les procédures stockées ou les déclencheurs comme une instruction entière. Normalement dans un fichier. sql vous définissez un autre DELIMITER comme $$. La commande DELIMITER est utilisée pour changer le délimiteur standard des commandes MySQL

Vihanga Sahan
la source
1

Le délimiteur est un caractère en SQL qui est utilisé pour séparer les éléments de données dans une base de données. Il identifie le début et la fin de la chaîne de caractères. Généralement, le délimiteur utilisé dans SQL est «;».

Wenusara Kappetige
la source