Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

13.7.6.1 変数代入の SET 構文

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 構文を使用すると、サーバーまたはクライアントの操作に影響する様々なタイプの変数に値を割り当てることができます:

変数値を割り当てる 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

システム変数の名前と値を表示するには:

SET エラー処理

SET ステートメントの変数割当てが失敗した場合、ステートメント全体が失敗し、変数は変更されず、mysqld-auto.cnf ファイルも変更されません。

SET では、ここで説明する状況下でエラーが発生します。 ほとんどの例は、キーワード構文 (GLOBALSESSION など) を使用する SET ステートメントを示していますが、対応する修飾子 (@@GLOBAL.@@SESSION. など) を使用するステートメントにも原則が当てはまります。

  • SET (任意のバリアント) を使用した読取り専用変数の設定:

    mysql> SET GLOBAL version = 'abc';
    ERROR 1238 (HY000): Variable 'version' is a read only variable
  • GLOBALPERSIST または 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
  • グローバル値のみを持つ変数を設定するための GLOBALPERSIST または 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 とは異なります。