SET 構文

SET variable_assignment [, variable_assignment] ...

variable_assignment:
      user_var_name = expr
    | [GLOBAL | SESSION] system_var_name = expr
    | [@@global. | @@session. | @@]system_var_name = expr

SET ステートメントは、サーバやクライアントの操作に影響を与える、様々なタイプの変数に値を割り当てます。MySQL の古いバージョンは SET OPTION を採用していましたが、OPTION を持たない SET がより好まれるようになった為、この構文は廃止される事になりました。

このセクションでは、システム変数やユーザ変数に値を割り当てる SET の利用について説明します。変数に関するこれらのタイプの一般情報については 項 「システム変数」 と 項8.4. 「ユーザによって定義された変数」 を参照してください。システム変数も、項 「システム変数の使用」 で説明されているように、サーバ起動時に設定する事ができます。

SET 構文異型のいくつかが、別のコンテキストで利用されています。

次の説明は、変数を設定する為に利用する事ができる、異なる SET 構文を表しています。例では = 代入演算子を利用していますが、:= 演算子も許容されています。

ユーザ変数は @var_name として書かれ、次のように設定されます。

SET @var_name = expr;

多くのシステム変数は動的であり、SET ステートメントを利用してサーバが起動している間に変更する事ができます。(リストついては、項2. 「動的システム変数」 をご覧ください。)

SET を利用してシステム変数を変更するには、任意で修飾子が先行する var_name として参照してください。

A SET ステートメントは、カンマで区切られた複数変数割り当てを含む事ができます。もし複数のシステム変数を設定したら、ステートメント内の一番最近の GLOBALSESSION 修飾子が、指定された修飾子を持たない次の変数に利用されます。

例:

SET sort_buffer_size=10000;
SET @@local.sort_buffer_size=10000;
SET GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000;
SET @@sort_buffer_size=1000000;
SET @@global.sort_buffer_size=1000000, @@local.sort_buffer_size=1000000;

SET を利用してシステム変数に値を割り当てた時、(起動オプションでは可能なように)値の中でサフィックス文字を利用する事はできません。しかし、その値は式の形を取る事ができます。

SET sort_buffer_size = 10 * 1024 * 1024;

システム変数の @@var_name 構文は、別のデータベースとの互換性の為にサポートされています。

もしセッション システム変数を変更すると、セッションが終了するまで、または変数を異なる値に変更するまではその値は効果を持ち続けます。別のクライアントは変更を見る事ができません。

もしグローバル システム変数を変更すると、その値はサーバが再起動するまでの間記憶され、次の接続に利用されます。(グローバル システム変数を永久的な物にするには、それをオプション ファイルに設定する必要があります。)そのグローバル変数にアクセスする全てのクライアントが変更を見る事ができます。しかしその変更は、変更が行われた後に接続するクライアントの、対応するセッション変数に対してだけ影響を与えます。グローバル変数の変更は、現在接続中のクライアントのセッション変数には影響を与えません。(SET GLOBAL ステートメントを発行するクライアントにも)

不正使用を防ぐ為に、もし SET GLOBALSET SESSION とだけ利用できる変数と共に利用したり、グローバル変数を設定する時に GLOBAL (または @@global.)を指定しなかったりすると、MySQL はエラーを作成します。

SESSION 変数を GLOBAL 値に、または GLOBAL 値をコンパイル インされた MySQL デフォルト値に設定するには、DEFAULT キーワードを利用してください。例えば、次の2つのステートメントは max_join_size のセッション値をグローバル値に設定する上で同一です。

SET max_join_size=DEFAULT;
SET @@session.max_join_size=@@global.max_join_size;

全てのシステム変数を DEFAULT に設定できる訳では有りません。そのような場合、DEFAULT の利用はエラーを引き起こします。

@@ 修飾子の1つを利用する事で、式の中の特定のグローバル、またはシステム変数の値を参照する事ができます。例えば、このようにして SELECT ステートメント内の値を検索する事ができます。

SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode;

@@var_name (@@global.@@session. を指定しない場合)のような式でシステム変数を参照する時、MySQL はセッション値が存在すればそれを返し、そうでなければグローバル値を返します。(これは、毎回セッション値を参照する SET @@var_name = value とは異なります。)

システム変数名と値を表示するには、SHOW VARIABLES ステートメントを利用してください。(詳しくは 項30. 「SHOW VARIABLES 構文」 を参照してください。)

次のリストは、非スタンダード構文を持つオプションについて説明しています。システム変数のリスト中に無い物は、項 「システム変数」 で説明されています。ここで説明されているオプションが SHOW VARIABLES で表示されていないとしても、SELECT を利用してそれらの値を得る事ができます。(CHARACTER SETSET NAMES は例外です。)例:

mysql> SELECT @@AUTOCOMMIT;
+--------------+
| @@AUTOCOMMIT |
+--------------+
|            1 |
+--------------+

これらのオプションは、大文字でも小文字でもかまいません。