web-dev-qa-db-ja.com

MySQLの区切り文字

人々が区切り文字を使用しているのをよく見ます。デリミタとは何か、そしてそれらの目的は何かを見つけようとしました。 20分間のグーグル検索の後、私が満足する答えを見つけることができませんでした。だから、私の質問は次のとおりです:区切り文字とは何ですか?

128
System.Data

通常、デフォルトの;以外の区切り文字は、複数のステートメントを定義する必要がある関数、ストアドプロシージャ、およびトリガーを定義するときに使用されます。プロシージャ全体の終了を定義するために使用される$$のような異なる区切り文字を定義しますが、その内部では、個々のステートメントはそれぞれ;で終了します。このようにして、コードがmysqlクライアントで実行されると、クライアントは内部の個々のステートメントを実行するのではなく、プロシージャ全体が終了する場所を認識して、ユニットとして実行できます。

DELIMITERキーワードはコマンドラインのmysqlクライアント(および他の一部のクライアント)のみの機能であり、通常のMySQL言語機能ではないことに注意してください。プログラミング言語APIを介してMySQLに渡そうとしても機能しません。 PHPMyAdminなどの他のクライアントには、デフォルト以外の区切り文字を指定する他のメソッドがあります。

例:

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 ;

サポートしていないクライアントでDELIMITERを使用しようとすると、サーバーに送信され、構文エラーが報告されます。たとえば、PHPとMySQLiを使用する場合:

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

エラー:

SQL構文にエラーがあります。行1で「DELIMITER $$」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

195

DELIMITERステートメントは、セミコロン(;)である標準の区切り文字を別の区切り文字に変更します。区切り文字はセミコロン(;)から二重スラッシュ//に変更されます。

区切り文字を変更する必要があるのはなぜですか?

Mysqlツールに各ステートメントを一度に解釈させるのではなく、サーバー全体にストアドプロシージャ、カスタム関数などを渡したいためです。

17
Pradeep Singh

BEGIN...ENDブロックを持つストアドルーチンを作成すると、ブロック内のステートメントはセミコロン(;)で終了します。ただし、CREATE PROCEDUREステートメントにはターミネーターも必要です。そのため、ルーチンの本体内のセミコロンがCREATE PROCEDUREを終了するか、プロシージャの本体内のステートメントの1つを終了するかがあいまいになります。

あいまいさを解決する方法は、MySQLクライアントがCREATE PROCEDUREステートメントの真のターミネーターとして認識する別個の文字列(プロシージャの本体内で発生してはならない)を宣言することです。

7
Rizwan Ahmed

DELIMITERを定義して、ステートメント、関数、ストアドプロシージャ、またはトリガーをステートメント全体として扱うようにmysqlクライアントに指示します。通常、.sqlファイルでは、$$などの別のDELIMITERを設定します。 DELIMITERコマンドは、MySQLコマンドの標準の区切り文字(つまり;)を変更するために使用されます。ルーチン内のステートメント(関数、ストアドプロシージャ、またはトリガー)はセミコロン(;)で終わるため、それらを複合ステートメントとして扱うために、DELIMITERを使用します。同じファイルまたはコマンドラインで異なるルーチンを使用するときに定義しない場合、構文エラーが発生します。

さまざまな非予約文字を使用して、独自のカスタム区切り文字を作成できることに注意してください。バックスラッシュ(\)文字はMySQLのエスケープ文字であるため、使用しないでください。

DELIMITERは実際にはMySQL言語のコマンドではなく、クライアントのコマンドです。

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
Optimizer

区切り文字は、SQLステートメントへの入力が完了したことをMySQLクライアントに伝えるために使用する文字または文字列です。