Trennzeichen in MySQL

165

Ich sehe oft Leute, die Begrenzer verwenden. Ich habe versucht herauszufinden, was Trennzeichen sind und was ihr Zweck ist. Nach 20 Minuten googeln konnte ich keine Antwort finden, die mich zufriedenstellt. Meine Frage lautet nun: Was sind Trennzeichen und wann sollte ich sie verwenden?

Systemdaten
quelle

Antworten:

245

Andere als die Standardbegrenzer ;werden normalerweise verwendet, wenn Funktionen, gespeicherte Prozeduren und Trigger definiert werden, bei denen Sie mehrere Anweisungen definieren müssen. Sie definieren ein anderes Trennzeichen, mit $$dem das Ende der gesamten Prozedur definiert wird. Darin werden jedoch einzelne Anweisungen jeweils durch beendet ;. Auf diese Weise kann der mysqlClient beim Ausführen des Codes im Client erkennen, wo die gesamte Prozedur endet, und sie als Einheit ausführen, anstatt die einzelnen Anweisungen im Client auszuführen.

Beachten Sie, dass das DELIMITERSchlüsselwort nur eine Funktion des Befehlszeilenclients mysql(und einiger anderer Clients) ist und keine reguläre MySQL- Sprachfunktion . Es wird nicht funktionieren, wenn Sie versuchen, es über eine Programmiersprachen-API an MySQL zu übergeben. Einige andere Clients wie PHPMyAdmin verfügen über andere Methoden, um ein nicht standardmäßiges Trennzeichen anzugeben.

Beispiel:

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 ;

Wenn Sie versuchen, DELIMITERmit einem Client zu arbeiten, der ihn nicht unterstützt, wird er an den Server gesendet, der einen Syntaxfehler meldet. Zum Beispiel mit PHP und MySQLi:

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

Fehler mit:

Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von 'DELIMITER $$' in Zeile 1

Michael Berkowski
quelle
3
In welchen Szenarien ist es sinnvoll, ein Trennzeichen zu verwenden? Ich habe es nicht wirklich verstanden.
System.Data
2
@ System.Data Erster Satz meiner Antwort - beim Definieren gespeicherter Prozeduren, benutzerdefinierter Funktionen und Trigger. Jedes Mal, wenn mehrere Anweisungen als Einheit in der MySQL-Befehlszeile ausgeführt werden.
Michael Berkowski
2
Beachten Sie, dass der Befehl DELIMITER in PhpMyAdmin SQL nicht funktioniert (zumindest in einigen Versionen). Stattdessen können Sie das Trennzeichen in einem separaten Feld für SQL selbst festlegen. Das hat mich schon
Sehr unregelmäßig
1
@ MichaelBerkowski, hoffentlich bekommen wir einen Weg, dies in Zukunft zu tun.
Pacerier
1
@StockB Bei dieser Antwort ging es nicht wirklich darum, warum gespeicherte Prozeduren von Vorteil sind. Die Erwähnung von "einer Einheit" bezog sich darauf, wie MySQL den SP beim Parsen interpretieren könnte: Suchen Sie die Einheitengrenzen nach Trennzeichen und analysieren Sie dann einzelne Anweisungen darin. Da Sie jedoch gefragt haben, können Sie mit einem SP mit mehreren Anweisungen Implementierungsdetails vor der Anwendung verbergen, die den SP aufruft. Der Anwendungscode muss sich nicht mit der Ausführung von SQL befassen (und Sie können ihn bei Bedarf ändern), solange er ein konsistentes Ergebnis liefert. Genau wie eine Funktion im Code.
Michael Berkowski
21

Die DELIMITER-Anweisung ändert das Standardtrennzeichen, das Semikolon (;) ist, in ein anderes. Das Trennzeichen wird vom Semikolon (;) in doppelte Schrägstriche // geändert.

Warum müssen wir das Trennzeichen ändern?

Weil wir die gespeicherte Prozedur, benutzerdefinierte Funktionen usw. an den Server als Ganzes übergeben möchten, anstatt das MySQL-Tool jede Anweisung gleichzeitig interpretieren zu lassen.

Pradeep Singh
quelle
13

Wenn Sie eine gespeicherte Routine mit einem BEGIN...ENDBlock erstellen , werden Anweisungen innerhalb des Blocks durch ein Semikolon beendet (;). Die CREATE PROCEDUREAussage braucht aber auch einen Terminator. Es wird also mehrdeutig, ob das Semikolon im Hauptteil der Routine endet CREATE PROCEDUREoder eine der Anweisungen im Hauptteil der Prozedur beendet.

Die Möglichkeit, die Mehrdeutigkeit aufzulösen, besteht darin, eine eindeutige Zeichenfolge zu deklarieren (die nicht im Hauptteil der Prozedur vorkommen darf), die der MySQL-Client als den wahren Terminator für die CREATE PROCEDUREAnweisung erkennt .

Rizwan Ahmed
quelle
1
Dies ist die beste Antwort, da sie den richtigen Grund für die Verwendung von DELIMITER auf einfachste Weise und ohne Verwirrung angibt. Vielen Dank
Fakhar Anwar
6

Das Trennzeichen ist das Zeichen oder die Zeichenfolge, mit der Sie dem MySQL-Client mitteilen, dass Sie die Eingabe einer SQL-Anweisung abgeschlossen haben.

Kaumadie Kariyawasam
quelle
5

Sie definieren einen DELIMITER, der den MySQL-Client anweist, die Anweisungen, Funktionen, gespeicherten Prozeduren oder Trigger als vollständige Anweisung zu behandeln. Normalerweise setzen Sie in einer .sql-Datei einen anderen DELIMITER wie $$. Der Befehl DELIMITER wird verwendet, um das Standardtrennzeichen von MySQL-Befehlen (dh;) zu ändern. Da die Anweisungen in den Routinen (Funktionen, gespeicherte Prozeduren oder Trigger) mit einem Semikolon (;) enden, verwenden wir DELIMITER, um sie als zusammengesetzte Anweisung zu behandeln. Wenn dies nicht definiert ist, wenn verschiedene Routinen in derselben Datei oder Befehlszeile verwendet werden, tritt ein Syntaxfehler auf.

Beachten Sie, dass Sie verschiedene nicht reservierte Zeichen verwenden können, um ein eigenes benutzerdefiniertes Trennzeichen zu erstellen. Sie sollten die Verwendung des Backslash-Zeichens (\) vermeiden, da dies das Escape-Zeichen für MySQL ist.

DELIMITER ist nicht wirklich ein MySQL-Sprachbefehl, sondern ein Client-Befehl.

Beispiel

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 ;
Optimierer
quelle
Sie können ein Trennzeichen hinzufügen, um den Bereich Ihres MySQL-Prozedurcodes zu definieren. Weitere Informationen finden
Ankur Kumar Singh
1

DELIMITER weist den MySQL-Client an, die Anweisungen, Funktionen, gespeicherten Prozeduren oder Trigger als vollständige Anweisung zu behandeln. Normalerweise in a. SQL-Datei Sie setzen einen anderen DELIMITER wie $$. Der Befehl DELIMITER wird verwendet, um das Standardtrennzeichen von MySQL-Befehlen zu ändern

Vihanga Sahan
quelle
1

Das Trennzeichen ist ein Zeichen in SQL, mit dem die Datenelemente in einer Datenbank getrennt werden. Es identifiziert den Anfang und das Ende der Zeichenfolge. Im Allgemeinen ist das in SQL verwendete Trennzeichen ';'.

Wenusara Kappetige
quelle