MySQLの区切り文字


165

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

回答:


245

;通常、デフォルト以外の区切り文字は、 複数のステートメントを定義する必要がある関数、ストアドプロシージャ、およびトリガーを定義するときに使用されます。$$プロシージャ全体の終了を定義するために使用されるような別の区切り文字を定義しますが、その内部では、個々のステートメントはそれぞれで終了し;ます。このようにして、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サーバーのバージョンに対応するマニュアルを確認してください


3
区切り文字を使用することが理にかなっているシナリオは何ですか?本当にわかりませんでした。
System.Data 2012

2
@ System.Data私の回答の最初の文-ストアドプロシージャ、カスタム関数、およびトリガーを定義するとき。MySQLコマンドラインで1つの単位として複数のステートメントが実行されるとき。
マイケル・

2
DELIMITERコマンドは、PhpMyAdmin SQL(少なくとも一部のバージョン)からは機能しないことに注意してください。代わりに、別のフィールドの区切り文字をSQL自体に設定できます。これはかなりの間私を混乱させました... :-)
非常に不規則な

1
@MichaelBerkowski、うまくいけば、私たちは将来それを行う方法を手に入れるでしょう。
Pacerier、2015

1
@StockBこの回答は、ストアドプロシージャが有益である理由についてではなく、「1つのユニット」という言及は、MySQLがSPを解析するときに、SPを解釈する方法を指していました。しかし、あなたが尋ねたので、マルチステートメントSPを使用すると、SPを呼び出すアプリケーションから実装の詳細を隠すことができます。アプリケーションコードは、一貫した結果を返す限り、SQLの実行内容(および必要に応じて変更可能)を気にする必要はありません。コードの関数のように。
Michael Berkowski、2017年

21

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

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

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


13

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

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


1
これは、DELIMITERを最も簡単な方法で、混乱を招くことなく使用する正しい理由を伝えているため、最良の答えです。ありがとう
Fakhar Anwar、

6

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


5

ステートメント、関数、ストアドプロシージャ、またはトリガーをステートメント全体として扱うようにmysqlクライアントに指示するには、DELIMITERを定義します。通常、.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 ;

区切り記号を追加して、mysqlプロシージャコードの範囲を定義できます。詳細については、私のチュートリアルtechflirt.com/mysql-stored-procedure-tutorialの
Kumar Singh

1

ステートメント、関数、ストアドプロシージャ、またはトリガーをステートメント全体として扱うようにmysqlクライアントに指示するためのDELIMITER。通常は。$$のような別のDELIMITERを設定したSQLファイル。DELIMITERコマンドは、MySQLコマンドの標準の区切り文字を変更するために使用されます


1

区切り文字は、データベース内のデータ項目を区切るために使用されるSQLの文字です。文字列の始まりと終わりを識別します。通常、SQLで使用される区切り文字は「;」です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.