Delimitadores no MySQL

165

Costumo ver pessoas usando delimitadores. Tentei descobrir o que são delimitadores e qual é o objetivo deles. Após 20 minutos de pesquisa no Google, não consegui encontrar uma resposta que me satisfizesse. Então, minha pergunta é agora: o que são delimitadores e quando devo usá-los?

System.Data
fonte

Respostas:

245

Delimitadores diferentes do padrão ;geralmente são usados ​​ao definir funções, procedimentos armazenados e acionadores, nos quais você deve definir várias instruções. Você define um delimitador diferente como o $$que é usado para definir o final de todo o procedimento, mas dentro dele, cada instrução individual é terminada por ;. Dessa forma, quando o código é executado no mysqlcliente, o cliente pode dizer onde o procedimento inteiro termina e executá-lo como uma unidade, em vez de executar as instruções individuais.

Observe que a DELIMITERpalavra-chave é uma função apenas do mysqlcliente de linha de comando (e de alguns outros clientes) e não um recurso regular da linguagem MySQL. Não funcionará se você tentar passar por uma API da linguagem de programação para o MySQL. Alguns outros clientes, como o PHPMyAdmin, têm outros métodos para especificar um delimitador não padrão.

Exemplo:

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 ;

Tentar usar DELIMITERcom um cliente que não o suporta fará com que ele seja enviado ao servidor, o que reportará um erro de sintaxe. Por exemplo, usando PHP e MySQLi:

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

Erros com:

Você tem um erro na sua sintaxe SQL; verifique o manual que corresponde à versão do servidor MySQL para obter a sintaxe correta perto de 'DELIMITER $$' na linha 1

Michael Berkowski
fonte
3
Quais são os cenários em que faz sentido usar um delimitador? Eu realmente não entendi.
System.Data
2
@ System.Data Primeira frase da minha resposta - ao definir procedimentos armazenados, funções personalizadas e gatilhos. A qualquer momento, várias instruções são executadas como uma unidade na linha de comando do MySQL.
Michael Berkowski
2
Observe que o comando DELIMITER não funciona em um PhpMyAdmin SQL (pelo menos, algumas versões). Em vez disso, você pode definir o delimitador em um campo separado para o próprio SQL. Este tinha me confundido por algum tempo ... :-)
altamente irregular
1
@ MichaelBerkowski, espero que tenhamos uma maneira de fazer isso no futuro.
Pacerier
1
@StockB Esta resposta não foi exatamente sobre por que os procedimentos armazenados são benéficos, a menção de "uma unidade" se refere a como o MySQL seria capaz de interpretar o SP ao analisá-lo: localize os limites da unidade por delimitador e analise as instruções individuais. Mas desde que você perguntou, o uso de um SP com várias instruções permitiria ocultar os detalhes da implementação do aplicativo que chama o SP. O código do aplicativo não precisa se preocupar com o que o SQL é executado (e você pode alterá-lo, se necessário), desde que retorne um resultado consistente. Assim como uma função no código.
Michael Berkowski
21

A instrução DELIMITER altera o delimitador padrão, que é ponto-e-vírgula (;) para outro. O delimitador é alterado de ponto e vírgula (;) para barras duplas //.

Por que precisamos alterar o delimitador?

Porque queremos passar o procedimento armazenado, funções personalizadas etc. para o servidor como um todo, em vez de permitir que a ferramenta mysql interprete cada instrução de cada vez.

Pradeep Singh
fonte
13

Quando você cria uma rotina armazenada que possui um BEGIN...ENDbloco, as instruções dentro do bloco são encerradas por ponto e vírgula (;). Mas a CREATE PROCEDUREdeclaração também precisa de um terminador. Portanto, torna-se ambíguo se o ponto-e-vírgula no corpo da rotina termina CREATE PROCEDUREou termina uma das instruções no corpo do procedimento.

A maneira de resolver a ambiguidade é declarar uma string distinta (que não deve ocorrer no corpo do procedimento) que o cliente MySQL reconhece como o verdadeiro terminador da CREATE PROCEDUREinstrução.

Rizwan Ahmed
fonte
1
Essa é a melhor resposta, pois está dizendo o motivo correto para usar DELIMITER da maneira mais simples e sem causar confusão. Obrigado
Fakhar Anwar
6

O delimitador é o caractere ou sequência de caracteres que você usará para informar ao cliente MySQL que você terminou de digitar uma instrução Sql.

Kaumadie Kariyawasam
fonte
5

Você define um DELIMITER para dizer ao cliente mysql para tratar as instruções, funções, procedimentos armazenados ou gatilhos como uma instrução inteira. Normalmente, em um arquivo .sql, você define um DELIMITER diferente como $$. O comando DELIMITER é usado para alterar o delimitador padrão dos comandos do MySQL (ou seja;). Como as instruções nas rotinas (funções, procedimentos armazenados ou gatilhos) terminam com ponto-e-vírgula (;), para tratá-las como uma declaração composta, usamos DELIMITER. Se não definido ao usar rotinas diferentes no mesmo arquivo ou linha de comando, ocorrerá um erro de sintaxe.

Observe que você pode usar uma variedade de caracteres não reservados para criar seu próprio delimitador personalizado. Você deve evitar o uso do caractere de barra invertida (\), porque esse é o caractere de escape do MySQL.

DELIMITER não é realmente um comando de linguagem MySQL, é um comando de cliente.

Exemplo

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 ;
Optimizer
fonte
Você pode adicionar delimitador para definir o intervalo do seu código de procedimento mysql. Para mais detalhes consulte a última seção do meu tutorial techflirt.com/mysql-stored-procedure-tutorial
Ankur Kumar Singh
1

DELIMITER para dizer ao cliente mysql para tratar as instruções, funções, procedimentos armazenados ou gatilhos como uma instrução inteira. Normalmente em um. arquivo sql, você define um DELIMITER diferente como $$. O comando DELIMITER é usado para alterar o delimitador padrão dos comandos do MySQL

Vihanga Sahan
fonte
1

O delimitador é um caractere no SQL usado para separar os itens de dados em um banco de dados. Ele identifica o início e o fim da cadeia de caracteres. Geralmente, o delimitador usado no SQL é ';'.

Wenusara Kappetige
fonte