SET variable = expr [, variable = expr] ...
variable: {
user_var_name
| param_name
| local_var_name
| {GLOBAL | @@GLOBAL.} system_var_name
| {PERSIST | @@PERSIST.} system_var_name
| {PERSIST_ONLY | @@PERSIST_ONLY.} system_var_name
| [SESSION | @@SESSION. | @@] system_var_name
}
変数割当ての SET
構文を使用すると、サーバーまたはクライアントの操作に影響する様々なタイプの変数に値を割り当てることができます:
ユーザー定義変数。 セクション9.4「ユーザー定義変数」を参照してください。
ストアドプロシージャーやストアドファンクションのパラメータ、およびストアドプログラムのローカル変数。 セクション13.6.4「ストアドプログラム内の変数」を参照してください。
システム変数。 セクション5.1.8「サーバーシステム変数」を参照してください。 システム変数はまた、セクション5.1.9「システム変数の使用」で説明されているように、サーバーの起動時にも設定できます。
変数値を割り当てる SET
ステートメントはバイナリログに書き込まれないため、レプリケーションシナリオでは、変数値を実行するホストにのみ影響します。 すべてのレプリケーションホストに影響を与えるには、各ホストでステートメントを実行します。
次の各セクションでは、変数を設定するための SET
構文について説明します。 =
代入演算子を使用しますが、この目的で:=
代入演算子も許可されています。
ユーザー定義変数はセッション内でローカルに作成され、そのセッションのコンテキスト内にのみ存在します。セクション9.4「ユーザー定義変数」 を参照してください。
ユーザー定義変数は@
として書き込まれ、次のように式の値が割り当てられます:
var_name
SET @var_name = expr;
例:
SET @name = 43;
SET @total_tax = (SELECT SUM(tax) FROM taxable_transactions);
これらのステートメントで示されているように、expr
では単純 (リテラル値) から複雑 (スカラーサブクエリーによって返される値) までの範囲を指定できます。
パフォーマンススキーマ user_variables_by_thread
テーブルには、ユーザー定義変数に関する情報が含まれています。 セクション27.12.10「パフォーマンススキーマのユーザー定義変数テーブル」を参照してください。
SET
は、定義されているストアドオブジェクトのコンテキストで、パラメータおよびローカル変数に適用されます。 次の手順では、increment
プロシージャパラメータおよび counter
ローカル変数を使用します:
CREATE PROCEDURE p(increment INT)
BEGIN
DECLARE counter INT DEFAULT 0;
WHILE counter < 10 DO
-- ... do work ...
SET counter = counter + increment;
END WHILE;
END;
MySQL サーバーは、その操作を構成するシステム変数を保持します。 システム変数には、サーバー操作全体に影響するグローバル値、現在のセッションに影響するセッション値、またはその両方を指定できます。 多くのシステム変数は動的であり、SET
ステートメントを使用して実行時に変更し、現在のサーバーインスタンスの操作に影響を与えることができます。 SET
を使用して、特定のシステム変数をデータディレクトリ内の mysqld-auto.cnf
ファイルに永続化し、後続の起動のためのサーバー操作に影響を与えることもできます。
セッションシステム変数を変更しても、変数を別の値に変更するか、セッションが終了するまで、その値はセッション内で有効なままです。 この変更は、他のセッションには影響しません。
グローバルシステム変数を変更した場合、値は記憶され、変数を別の値に変更するかサーバーが終了するまで、新しいセッションのセッション値の初期化に使用されます。 変更は、グローバル値にアクセスするすべてのクライアントに表示されます。 ただし、変更は、変更後に接続するクライアントの対応するセッション値にのみ影響します。 グローバル変数の変更は、現在のクライアントセッションのセッション値には影響しません (グローバル値の変更が発生したセッションにも影響しません)。
グローバルシステム変数設定をサーバーの再起動後も適用されるように永続化するには、データディレクトリ内の mysqld-auto.cnf
ファイルに永続化します。 my.cnf
オプションファイルを手動で変更して永続的な構成変更を行うこともできますが、これは面倒であり、手動で入力した設定のエラーは後で検出されない可能性があります。 構文エラーのある設定は成功せず、サーバー構成を変更しないため、システム変数を永続化する SET
ステートメントはより便利であり、不正な設定が発生する可能性を回避します。 システム変数および mysqld-auto.cnf
ファイルの永続化の詳細は、セクション5.1.9.3「永続化されるシステム変数」 を参照してください。
グローバルシステム変数値を設定または永続化するには、常に特別な権限が必要です。 通常、セッションシステム変数の値を設定するには特別な権限は必要なく、例外がありますが、すべてのユーザーが設定できます。 詳細は、セクション5.1.9.1「システム変数権限」を参照してください。
次の説明では、システム変数を設定および永続化するための構文オプションについて説明します:
-
グローバルシステム変数に値を割り当てるには、変数名の前に
GLOBAL
キーワードまたは@@GLOBAL.
修飾子を付けます:SET GLOBAL max_connections = 1000; SET @@GLOBAL.max_connections = 1000;
-
セッションシステム変数に値を割り当てるには、変数名の前に
SESSION
またはLOCAL
キーワード、@@SESSION.
、@@LOCAL.
または@@
修飾子、あるいはキーワードなしまたは修飾子なしを付けます:SET SESSION sql_mode = 'TRADITIONAL'; SET LOCAL sql_mode = 'TRADITIONAL'; SET @@SESSION.sql_mode = 'TRADITIONAL'; SET @@LOCAL.sql_mode = 'TRADITIONAL'; SET @@sql_mode = 'TRADITIONAL'; SET sql_mode = 'TRADITIONAL';
クライアントは自分のセッション変数を変更できますが、ほかのどのクライアントのセッション変数も変更できません。
-
グローバルシステム変数をデータディレクトリ内の
mysqld-auto.cnf
オプションファイルに永続化するには、変数名の前にPERSIST
キーワードまたは@@PERSIST.
修飾子を付けます:SET PERSIST max_connections = 1000; SET @@PERSIST.max_connections = 1000;
この
SET
構文を使用すると、サーバーの再起動後も保持される構成を実行時に変更できます。SET GLOBAL
と同様に、SET PERSIST
はグローバル変数のランタイム値を設定しますが、変数設定もmysqld-auto.cnf
ファイルに書き込みます (既存の変数設定がある場合は置き換えます)。 -
グローバル変数のランタイム値を設定せずにグローバルシステム変数を
mysqld-auto.cnf
ファイルに永続化するには、変数名の前にPERSIST_ONLY
キーワードまたは@@PERSIST_ONLY.
修飾子を付けます:SET PERSIST_ONLY back_log = 100; SET @@PERSIST_ONLY.back_log = 100;
PERSIST
と同様に、PERSIST_ONLY
は変数設定をmysqld-auto.cnf
に書き込みます。 ただし、PERSIST
とは異なり、PERSIST_ONLY
はグローバル変数のランタイム値を変更しません。 これにより、PERSIST_ONLY
は、サーバーの起動時にのみ設定できる読取り専用システム変数の構成に適しています。
グローバルシステム変数値をコンパイル済の MySQL デフォルト値に設定するか、セッションシステム変数を現在対応するグローバル値に設定するには、変数を値 DEFAULT
に設定します。 たとえば、次の 2 つのステートメントは、max_join_size
のセッション値を現在のグローバル値に設定する場合と同じです:
SET @@SESSION.max_join_size = DEFAULT;
SET @@SESSION.max_join_size = @@GLOBAL.max_join_size;
SET
を使用してグローバルシステム変数を DEFAULT
の値またはリテラルのデフォルト値に永続化すると、変数のデフォルト値が割り当てられ、変数の設定が mysqld-auto.cnf
に追加されます。 ファイルから変数を削除するには、RESET PERSIST
を使用します。
一部のシステム変数は永続化できないか、永続的に制限されています。 セクション5.1.9.4「永続的で永続的に制限されないシステム変数」を参照してください。
プラグインによって実装されたシステム変数は、SET
ステートメントの実行時にプラグインがインストールされた場合に永続化できます。 永続化されたプラグイン変数の割り当ては、プラグインがまだインストールされている場合、それ以降のサーバーの再起動で有効になります。 プラグインがインストールされなくなった場合、サーバーが mysqld-auto.cnf
ファイルを読み取るときにプラグイン変数は存在しなくなります。 この場合、サーバーはエラーログに警告を書き込み、続行します:
currently unknown variable 'var_name'
was read from the persisted config file
システム変数の名前と値を表示するには:
SHOW VARIABLES
ステートメントを使用します。セクション13.7.7.41「SHOW VARIABLES ステートメント」 を参照してください。「複数のパフォーマンススキーマ」テーブルは、システム変数情報を提供します。 セクション27.12.14「パフォーマンススキーマシステム変数テーブル」を参照してください。
パフォーマンススキーマ
variables_info
テーブルには、各システム変数が最後に設定された時期とユーザーを示す情報が含まれています。 セクション27.12.14.2「パフォーマンススキーマ variables_info テーブル」を参照してください。パフォーマンススキーマ
persisted_variables
テーブルは、mysqld-auto.cnf
ファイルへの SQL インタフェースを提供し、SELECT
ステートメントを使用して実行時にその内容を検査できるようにします。 セクション27.12.14.1「パフォーマンススキーマ persisted_variables テーブル」を参照してください。
SET
ステートメントの変数割当てが失敗した場合、ステートメント全体が失敗し、変数は変更されず、mysqld-auto.cnf
ファイルも変更されません。
SET
では、ここで説明する状況下でエラーが発生します。 ほとんどの例は、キーワード構文 (GLOBAL
や SESSION
など) を使用する SET
ステートメントを示していますが、対応する修飾子 (@@GLOBAL.
や@@SESSION.
など) を使用するステートメントにも原則が当てはまります。
-
SET
(任意のバリアント) を使用した読取り専用変数の設定:mysql> SET GLOBAL version = 'abc'; ERROR 1238 (HY000): Variable 'version' is a read only variable
-
GLOBAL
、PERSIST
またはPERSIST_ONLY
を使用して、セッション値のみを持つ変数を設定します:mysql> SET GLOBAL sql_log_bin = ON; ERROR 1228 (HY000): Variable 'sql_log_bin' is a SESSION variable and can't be used with SET GLOBAL
-
SESSION
を使用して、グローバル値のみを持つ変数を設定します:mysql> SET SESSION max_connections = 1000; ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL
-
グローバル値のみを持つ変数を設定するための
GLOBAL
、PERSIST
またはPERSIST_ONLY
の省略:mysql> SET max_connections = 1000; ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL
-
PERSIST
またはPERSIST_ONLY
を使用して、永続化できない変数を設定します:mysql> SET PERSIST port = 3307; ERROR 1238 (HY000): Variable 'port' is a read only variable mysql> SET PERSIST_ONLY port = 3307; ERROR 1238 (HY000): Variable 'port' is a non persistent read only variable
@@GLOBAL.
,@@PERSIST.
,@@PERSIST_ONLY.
,@@SESSION.
および@@
修飾子は、システム変数にのみ適用されます。 ユーザー定義変数、ストアドプロシージャまたはストアドファンクションのパラメータ、またはストアドプログラムのローカル変数に適用しようとすると、エラーが発生します。すべてのシステム変数を
DEFAULT
に設定できるわけではありません。 このような場合、DEFAULT
を割り当てるとエラーになります。ユーザー定義変数、ストアドプロシージャまたはストアドファンクションのパラメータ、またはストアドプログラムのローカル変数に
DEFAULT
を割り当てようとすると、エラーが発生します。
SET
ステートメントは、カンマで区切られた複数の変数割り当てを含むことができます。 次のステートメントは、ユーザー定義変数とシステム変数に値を代入します:
SET @x = 1, SESSION sql_mode = '';
単一のステートメントで複数のシステム変数を設定した場合、ステートメントの最新の GLOBAL
, PERSIST
, PERSIST_ONLY
または SESSION
キーワードが、キーワードが指定されていない次の割当てに使用されます。
複数変数割当ての例:
SET GLOBAL sort_buffer_size = 1000000, SESSION sort_buffer_size = 1000000;
SET @@GLOBAL.sort_buffer_size = 1000000, @@LOCAL.sort_buffer_size = 1000000;
SET GLOBAL max_connections = 1000, sort_buffer_size = 1000000;
@@GLOBAL.
, @@PERSIST.
, @@PERSIST_ONLY.
, @@SESSION.
および@@
修飾子は、直後のシステム変数にのみ適用され、残りのシステム変数には適用されません。 次のステートメントは、sort_buffer_size
グローバル値を 50000 に、セッション値を 1000000 に設定します:
SET @@GLOBAL.sort_buffer_size = 50000, sort_buffer_size = 1000000;
式でシステム変数の値を参照するには、いずれかの@@
-modifiers を使用します (式では許可されていない@@PERSIST.
および@@PERSIST_ONLY.
を除く)。 たとえば、次のような SELECT
ステートメントでシステム変数値を取得できます:
SELECT @@GLOBAL.sql_mode, @@SESSION.sql_mode, @@sql_mode;
式内のシステム変数への参照が@@
(var_name
@@GLOBAL.
または@@SESSION.
ではなく@@
を使用) として存在する場合はセッション値を返し、それ以外の場合はグローバル値を返します。 これは、常にセッション値を参照する SET @@
とは異なります。
var_name
= expr