人々が区切り文字を使用しているのをよく見ます。デリミタとは何か、そしてそれらの目的は何かを見つけようとしました。 20分間のグーグル検索の後、私が満足する答えを見つけることができませんでした。だから、私の質問は次のとおりです:区切り文字とは何ですか?
通常、デフォルトの;
以外の区切り文字は、複数のステートメントを定義する必要がある関数、ストアドプロシージャ、およびトリガーを定義するときに使用されます。プロシージャ全体の終了を定義するために使用される$$
のような異なる区切り文字を定義しますが、その内部では、個々のステートメントはそれぞれ;
で終了します。このようにして、コードが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サーバーのバージョンに対応するマニュアルを確認してください。
DELIMITERステートメントは、セミコロン(;)である標準の区切り文字を別の区切り文字に変更します。区切り文字はセミコロン(;)から二重スラッシュ//に変更されます。
区切り文字を変更する必要があるのはなぜですか?
Mysqlツールに各ステートメントを一度に解釈させるのではなく、サーバー全体にストアドプロシージャ、カスタム関数などを渡したいためです。
BEGIN...END
ブロックを持つストアドルーチンを作成すると、ブロック内のステートメントはセミコロン(;)
で終了します。ただし、CREATE PROCEDURE
ステートメントにはターミネーターも必要です。そのため、ルーチンの本体内のセミコロンがCREATE PROCEDURE
を終了するか、プロシージャの本体内のステートメントの1つを終了するかがあいまいになります。
あいまいさを解決する方法は、MySQLクライアントがCREATE PROCEDURE
ステートメントの真のターミネーターとして認識する別個の文字列(プロシージャの本体内で発生してはならない)を宣言することです。
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 ;
区切り文字は、SQLステートメントへの入力が完了したことをMySQLクライアントに伝えるために使用する文字または文字列です。