1. ホーム
  2. mysql

[解決済み] MySQLのデリミタ

2022-04-28 18:17:22

質問

デリミタを使っている人をよく見かけます。私もデリミタとは何か、その目的は何かを調べてみました。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 サーバのバージョンにお問い合わせください。