Delimitatori in MySQL


165

Vedo spesso che le persone usano i delimitatori. Mi sono provato a scoprire cosa sono i delimitatori e qual è il loro scopo. Dopo 20 minuti di ricerche su Google, non sono riuscito a trovare una risposta che mi soddisfacesse. Quindi, la mia domanda è ora: cosa sono i delimitatori e quando dovrei usarli?

Risposte:


246

I delimitatori diversi da quelli predefiniti ;vengono in genere utilizzati quando si definiscono funzioni, stored procedure e trigger in cui è necessario definire più istruzioni. Definisci un delimitatore diverso come quello $$utilizzato per definire la fine dell'intera procedura, ma al suo interno le singole istruzioni sono terminate da ciascuna ;. In questo modo, quando il codice viene eseguito nel mysqlclient, il client può dire dove termina l'intera procedura ed eseguirlo come unità anziché eseguire le singole istruzioni all'interno.

Si noti che la DELIMITERparola chiave è una funzione del mysqlclient della riga di comando (e di alcuni altri client) e non una normale funzione del linguaggio MySQL. Non funzionerà se si tenta di passarlo attraverso un'API del linguaggio di programmazione a MySQL. Alcuni altri client come PHPMyAdmin hanno altri metodi per specificare un delimitatore non predefinito.

Esempio:

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 ;

Tentare di utilizzare DELIMITERcon un client che non lo supporta causerà l'invio al server, che segnalerà un errore di sintassi. Ad esempio, usando PHP e MySQLi:

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

Errori con:

Si è verificato un errore nella sintassi SQL; controlla il manuale corrispondente alla versione del tuo server MySQL per la sintassi corretta da usare vicino a "DELIMITER $$" alla riga 1


3
Quali sono gli scenari in cui ha senso usare un delimitatore? Non l'ho capito davvero.
System.Data

2
@ System.Data Prima frase della mia risposta: quando si definiscono stored procedure, funzioni personalizzate e trigger. Ogni volta che più istruzioni vengono eseguite come unità sulla riga di comando di MySQL.
Michael Berkowski,

2
Si noti che il comando DELIMITER non funziona da un PhpMyAdmin SQL (almeno alcune versioni). Al contrario, è possibile impostare il delimitatore in un campo separato sull'SQL stesso. Questo mi ha confuso per un bel po 'di tempo ... :-)
Altamente irregolare,

1
@MichaelBerkowski, Speriamo di avere un modo per farlo in futuro.
Pacerier,

1
@StockB Questa risposta non era in realtà il motivo per cui le procedure memorizzate sono utili, la menzione di "una unità" si riferiva a come MySQL sarebbe in grado di interpretare l'SP durante l'analisi: individuare i limiti dell'unità mediante delimitatore, quindi analizzare le singole dichiarazioni all'interno. Ma poiché hai chiesto, l'uso di un SP multi-istruzione ti permetterebbe di nascondere i dettagli dell'implementazione dall'applicazione che chiama SP. Il codice dell'applicazione non deve preoccuparsi di quale SQL viene eseguito (e, se necessario, è possibile modificarlo) purché restituisca un risultato coerente. Proprio come una funzione nel codice.
Michael Berkowski,

21

L'istruzione DELIMITER modifica il delimitatore standard che è punto e virgola (;) in un altro. Il delimitatore viene modificato dal punto e virgola (;) a doppie barre //.

Perché dobbiamo cambiare il delimitatore?

Perché vogliamo passare la procedura memorizzata, le funzioni personalizzate ecc. Al server nel suo complesso piuttosto che lasciare che lo strumento mysql interpreti ogni istruzione alla volta.


13

Quando si crea una routine memorizzata con un BEGIN...ENDblocco, le istruzioni all'interno del blocco vengono terminate con un punto e virgola (;). Ma la CREATE PROCEDUREdichiarazione ha anche bisogno di un terminatore. Quindi diventa ambiguo se il punto e virgola all'interno del corpo della routine termina CREATE PROCEDUREo termina una delle istruzioni all'interno del corpo della procedura.

Il modo per risolvere l'ambiguità è dichiarare una stringa distinta (che non deve trovarsi nel corpo della procedura) che il client MySQL riconosce come il vero terminatore CREATE PROCEDUREdell'istruzione.


1
Questa è la risposta migliore perché sta dicendo il motivo corretto per utilizzare DELIMITER nel modo più semplice e senza creare confusione. Grazie
Fakhar Anwar il

6

Il delimitatore è il carattere o la stringa di caratteri che utilizzerai per comunicare al client MySQL che hai finito di digitare un'istruzione Sql.


5

Definisci un DELIMITER per dire al client mysql di trattare le istruzioni, le funzioni, le procedure memorizzate o i trigger come un'intera istruzione. Normalmente in un file .sql si imposta un DELIMITER diverso come $$. Il comando DELIMITER viene utilizzato per modificare il delimitatore standard dei comandi MySQL (ovvero;). Poiché le istruzioni all'interno delle routine (funzioni, stored procedure o trigger) terminano con un punto e virgola (;), per trattarle come un'istruzione composta usiamo DELIMITER. Se non definito quando si utilizzano routine diverse nello stesso file o nella stessa riga di comando, verrà visualizzato un errore di sintassi.

Nota che puoi usare una varietà di caratteri non riservati per creare il tuo delimitatore personalizzato. Dovresti evitare l'uso del carattere barra rovesciata (\) perché è il carattere di escape per MySQL.

DELIMITER non è in realtà un comando in linguaggio MySQL, è un comando client.

Esempio

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 ;

È possibile aggiungere delimitatore per definire l'intervallo del codice della procedura mysql. Per maggiori dettagli si prega di fare riferimento all'ultima sezione del mio tutorial techflirt.com/mysql-stored-procedure-tutorial
Ankur Kumar Singh

1

DELIMITER per dire al client mysql di trattare le istruzioni, le funzioni, le procedure memorizzate o i trigger come un'intera istruzione. Normalmente in a. file sql si imposta un DELIMITER diverso come $$. Il comando DELIMITER viene utilizzato per modificare il delimitatore standard dei comandi MySQL


1

Il delimitatore è un carattere in SQL che viene utilizzato per separare gli elementi di dati in un database. Identifica l'inizio e la fine della stringa di caratteri. Generalmente, il delimitatore utilizzato in SQL è ';'.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.