Delimitadores en MySQL


A menudo veo que la gente está usando delimitadores. Traté de averiguar cuáles son los delimitadores y cuál es su propósito. Después de 20 minutos de buscar en Google, no pude encontrar una respuesta que me satisfaga. Entonces, mi pregunta es ahora: ¿Qué son los delimitadores y cuándo debo usarlos?

Author: Ahmed, 2012-04-21

5 answers

Los delimitadores que no sean los predeterminados ; se utilizan normalmente al definir funciones, procedimientos almacenados y disparadores en los que debe definir varias sentencias. Se define un delimitador diferente como $$ que se utiliza para definir el final de todo el procedimiento, pero dentro de él, las sentencias individuales son terminadas por ;. De esta manera, cuando el código se ejecuta en el cliente mysql, el cliente puede decir dónde termina todo el procedimiento y ejecutarlo como una unidad en lugar de ejecutar el declaraciones individuales dentro.

Tenga en cuenta que la palabra clave DELIMITER es una función del cliente de línea de comandos mysql (y algunos otros clientes) solamente y no una característica del lenguaje MySQL normal. No funcionará si intentas pasarlo a través de una API de lenguaje de programación a MySQL. Algunos otros clientes como phpMyAdmin tienen otros métodos para especificar un delimitador no predeterminado.

Ejemplo:

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 ;

Intentar usar DELIMITER con un cliente que no lo soporta hará que se envíe a la servidor, que reportará un error de sintaxis. Por ejemplo, usando PHP y MySQLi:

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

Errores con:

Tiene un error en su sintaxis SQL; consulte el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de 'DELIMITER DELIM' en la línea 1

 158
Author: Michael Berkowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-09 14:12:06

La instrucción DELIMITER cambia el delimiter estándar que es punto y coma ( ;) a otro. El delimitador se cambia de punto y coma (;) a doble barra //.

¿por Qué tenemos que cambiar el delimitador?

Porque queremos pasar el procedimiento almacenado, funciones personalizadas, etc. al servidor como un todo en lugar de permitir que mysql tool interprete cada sentencia a la vez.

 13
Author: Pradeep Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-02 09:28:23

Cuando crea una rutina almacenada que tiene un bloque BEGIN...END, las instrucciones dentro del bloque terminan con punto y coma (;). Pero la instrucción CREATE PROCEDURE también necesita un terminador. Así que se vuelve ambiguo si el punto y coma dentro del cuerpo de la rutina termina CREATE PROCEDURE, o termina una de las declaraciones dentro del cuerpo del procedimiento.

La forma de resolver la ambigüedad es declarar una cadena distinta (que no debe ocurrir dentro del cuerpo del procedimiento) que el cliente MySQL reconoce como el verdadero terminador para la instrucción CREATE PROCEDURE.

 5
Author: Rizwan Ahmed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-18 23:42:09

Se define un DELIMITADOR para indicar al cliente mysql que trate las sentencias, funciones, procedimientos almacenados o disparadores como una sentencia completa. Normalmente en a .archivo sql se establece un DELIMITADOR diferente como$ $. El comando DELIMITER se usa para cambiar el delimitador estándar de los comandos MySQL (i.e.;). Como las sentencias dentro de las rutinas (funciones, procedimientos almacenados o disparadores) terminan con un punto y coma (;), para tratarlas como una sentencia compuesta usamos DELIMITADOR. Si no está definido al usar diferentes rutinas en el mismo archivo o línea de comandos, dará error de sintaxis.

Tenga en cuenta que puede usar una variedad de caracteres no reservados para crear su propio delimitador personalizado. Debe evitar el uso del carácter de barra invertida (\) porque ese es el carácter de escape para MySQL.

DELIMITER no es realmente un comando del lenguaje MySQL, es un comando del cliente.

Ejemplo

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 ;
 3
Author: Optimizer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-06 14:37:54

El delimitador es el carácter o cadena de caracteres que usará para decirle al cliente MySQL que ha terminado de escribir una instrucción Sql.

 0
Author: Kaumadie Kariyawasam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-23 13:42:00