Delimitadores en MySQL

165

A menudo veo que la gente usa Delimitadores. Traté de averiguar qué son los delimitadores y cuál es su propósito. Después de 20 minutos de búsqueda en Google, no pude encontrar una respuesta que me satisface. Entonces, mi pregunta es ahora: ¿Qué son los delimitadores y cuándo debo usarlos?

Datos de sistema
fuente

Respuestas:

246

Los delimitadores que no sean los predeterminados ;se usan generalmente al definir funciones, procedimientos almacenados y disparadores en los que debe definir varias declaraciones. Usted define un delimitador diferente, como el $$que se usa para definir el final de todo el procedimiento, pero dentro de él, cada declaración finaliza ;. De esa manera, cuando el código se ejecuta en elmysql cliente, el cliente puede decir dónde termina todo el procedimiento y ejecutarlo como una unidad en lugar de ejecutar las declaraciones individuales en su interior.

Tenga en cuenta que la DELIMITERpalabra clave es una función del mysqlcliente de línea de comandos (y algunos otros clientes) solamente y no una característica normal del lenguaje MySQL. No funcionará si intentas pasarlo a través de un lenguaje de programación API 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 ;

Si intenta utilizarlo DELIMITERcon un cliente que no lo admite, lo enviará al servidor, que informará 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 la versión de su servidor MySQL para conocer la sintaxis correcta que se debe usar cerca de 'DELIMITER $$' en la línea 1

Michael Berkowski
fuente
3
¿Cuáles son los escenarios en los que tiene sentido usar un delimitador? Realmente no lo entendí.
System.Data
2
@ System.Data Primera oración de mi respuesta: al definir procedimientos almacenados, funciones personalizadas y disparadores. Cada vez que se ejecutan varias instrucciones como una unidad en la línea de comando de MySQL.
Michael Berkowski
2
Tenga en cuenta que el comando DELIMITER no funciona desde un PhpMyAdmin SQL (al menos, algunas versiones). En su lugar, puede establecer el delimitador en un campo separado para el propio SQL. Esto me confundió durante bastante tiempo ... :-)
Muy irregular
1
@MichaelBerkowski, espero que podamos encontrar una manera de hacerlo en el futuro.
Pacerier
1
@StockB Esta respuesta no fue realmente acerca de por qué los procedimientos almacenados son beneficiosos, la mención de "una unidad" se refería a cómo MySQL podría interpretar el SP al analizarlo: ubicar los límites de la unidad por delimitador, luego analizar las declaraciones individuales dentro. Pero como usted lo solicitó, el uso de un SP de múltiples declaraciones le permitiría ocultar detalles de implementación de la aplicación que llama al SP. El código de la aplicación no necesita preocuparse por lo que se ejecuta SQL (y puede cambiarlo si es necesario) siempre que devuelva un resultado consistente. Al igual que una función en el código.
Michael Berkowski
21

La instrucción DELIMITER cambia el delimitador estándar que es punto y coma (;) a otro. El delimitador se cambia del punto y coma (;) a barras dobles //.

¿Por qué tenemos que cambiar el delimitador?

Porque queremos pasar el procedimiento almacenado, las funciones personalizadas, etc. al servidor en su conjunto en lugar de dejar que la herramienta mysql interprete cada declaración a la vez.

Pradeep Singh
fuente
13

Cuando crea una rutina almacenada que tiene un BEGIN...ENDbloque, las declaraciones dentro del bloque terminan con punto (;)y coma . Pero la CREATE PROCEDUREdeclaración también necesita un terminador. Por lo tanto, resulta ambiguo si el punto y coma dentro del cuerpo de la rutina termina CREATE PROCEDUREo 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 de la CREATE PROCEDUREdeclaración.

Rizwan Ahmed
fuente
1
Esta es la mejor respuesta porque indica la razón correcta para usar DELIMITER de la manera más simple y sin causar confusión. Gracias
Fakhar Anwar
6

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

Kaumadie Kariyawasam
fuente
5

Usted define un DELIMITADOR para decirle al cliente mysql que trate las declaraciones, funciones, procedimientos almacenados o disparadores como una declaración completa. Normalmente en un archivo .sql establece un DELIMITADOR diferente como $$. El comando DELIMITER se usa para cambiar el delimitador estándar de los comandos MySQL (es decir,). Como las declaraciones dentro de las rutinas (funciones, procedimientos almacenados o disparadores) terminan con un punto y coma (;), para tratarlas como una declaración compuesta, usamos DELIMITER. Si no se define cuando se utilizan diferentes rutinas en el mismo archivo o línea de comando, dará un error de sintaxis.

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

DELIMITER no es realmente un comando de lenguaje MySQL, es un comando de 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 ;
Optimizador
fuente
Puede agregar delimitador para definir el rango de su código de procedimiento mysql. Para obtener más detalles, consulte la última sección de mi tutorial techflirt.com/mysql-stored-procedure-tutorial
Ankur Kumar Singh
1

DELIMITADOR para decirle al cliente mysql que trate las declaraciones, funciones, procedimientos almacenados o disparadores como una declaración completa. Normalmente en a. archivo sql establece un DELIMITADOR diferente como $$. El comando DELIMITER se usa para cambiar el delimitador estándar de los comandos MySQL

Vihanga Sahan
fuente
1

El delimitador es un carácter en SQL que se usa para separar los elementos de datos en una base de datos. Identifica el principio y el final de la cadena de caracteres. En general, el delimitador utilizado en SQL es ';'.

Wenusara Kappetige
fuente