動機
DELIMITER、ストアドプロシージャ 使ったことなかったので、調べてみました。
ストアドプロシージャ
ストアドプロシージャは、簡単に言えば、DBにおいて値を返さない関数のような処理の集まり。
値を返すものは、ストアドファンクションと呼ばれる。
DELIMITER に関して
デフォルトでは、MySQL は SQL 文の終わりを示すために ; を使用します。しかし、ストアドプロシージャのようなスクリプトでは、プロシージャ本体内でセミコロンが頻繁に使用されるため(複数の SQL ステートメントなど)、混乱を避けるために一時的に区切り文字を他のものに変更する必要があります。
例 デリミタの変更
この例では、ストアドプロシージャを定義するためにデリミタを // に変更します:
DELIMITER //
DROP PROCEDURE IF EXISTS SampleProcedure;
CREATE PROCEDURE sample_procedure()
BEGIN
DECLARE sample_variable INT DEFAULT 1;
SELECT sample_variable; -- セミコロンをストアドプロシージャーの中で使っています。
END //
DELIMITER ;
CALL SampleProcedure()
DROP PROCEDURE IF EXISTS sample_procedure;
説明
DELIMITER //: これは MySQL に一時的に区切り文字をデフォルトの ; から // に変更するように指示します。これで、MySQL は文の終わりを認識するために ; の代わりに // を待つようになります。
プロシージャの定義: CREATE PROCEDUREブロックの中では、複数のステートメントがセミコロン(;)で終わっています。区切り文字を変更したので、MySQLはこれらのセミコロンをプロシージャ全体の終わりとして解釈しません。
DELIMITER ;: プロシージャを定義した後、デリミタをデフォルトのセミコロン (;) に戻します。
一般的なデリミタ
//
$$
'#'
SQL ステートメントと衝突しない記号であれば何を選んでもかまいませんが、// または $$ がよく使われます。
複数の SQL ステートメントを含む複雑な MySQL オブジェクトを作成する場合、このテクニックは非常に重要です。
ストアドプロシージャ書くにあたり便利なもの
SET
SET @sample = 0;
は次のようになる:
ユーザ定義変数 (@sample) を宣言します: シンボルは MySQL のユーザ定義セッション変数を示します。これらの変数はセッションにスコープされ(つまり、接続の間アクセス可能)、ストアドプロシージャや関数に制限されません。
値 (0) を割り当てます: SET 文は、変数 @sample に値 0 を代入します。
使用例
カウンタ: これは通常、一括挿入、バッチ処理、ストアド プロシージャのループ ロジックなど、特定の回数を繰り返し実行する必要があるスクリプトやループでカウンタとして使用されます。
一時ストレージ: 中間結果を保存したり、スクリプトのフローを制御するためにも使用できます。
ループの使用例
データを一括挿入し、処理を複数回繰り返し実行するとします:
backticks '`'
MySQL では、バックスティック ( ) はバッククォートとも呼ばれ、テーブル名、カラム名、データベース名などの識別子を囲むために使用されます。これにより、予約キーワードや特殊文字をこれらの識別子で使用することができます。
バックティックの一般的な使用法
予約キーワードを識別子として使用する: 予約キーワード(SELECT、ORDER など)をテーブル名やカラム名として使用する場合、バックティックで囲むことで MySQL がキーワードとして解釈するのを防ぐことができます。
CREATE TABLE `select` (
`id` INT PRIMARY KEY,
`name` VARCHAR(100)
);
バックスティックがないと、select は MySQL キーワードなので構文エラーになります。
識別子での特殊文字の使用: テーブル名やカラム名にスペースや特殊文字が含まれる場合は、バックスティックが必要です。
CREATE TABLE `user data` (
`user-id` INT PRIMARY KEY,
`first name` VARCHAR(50)
);
大文字と小文字の区別: MySQL 識別子はオペレーティングシステムによって大文字と小文字が区別されます。バックティックを使用することで、OS に関係なく一貫した動作が保証されます。
安全のためのバックティックの使用: 識別子にバックティックが必要ない場合でも(特殊文字がない、または予約語でないため)、新しい予約語が導入される可能性のある将来のバージョンの MySQL での競合を避けるために、バックティックを使用することは良い習慣です。
Example Usage:
CREATE TABLE `order` (
`id` INT PRIMARY KEY,
`product_name` VARCHAR(100),
`order_date` DATE
);
ここでは、orderは予約キーワードですが、バックスティックを使用することで、テーブル名として使用することができます。
バックティックが不要な場合:
特殊文字を含まない識別子や予約キーワードでない識別子には、バックティックは必要ありません:
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50)
);
まとめ
バックティックは、特殊文字や予約語などの構文上の問題が発生する識別子(カラム名やテーブル名など)を囲むために使用されます。
バックティックを使用することで、特に動的スキーマや複雑なスキーマを扱う場合に、SQLスクリプトをより柔軟で堅牢なものにすることができます。