SET [GLOBAL|SESSION] <variable>

ステートメントSET [GLOBAL|SESSION]は、TiDB の組み込み変数の 1 つを変更します。これらの変数は、 SESSIONまたはGLOBALスコープのシステム変数またはユーザー変数いずれかになります。

注記:

MySQL と同様に、 GLOBAL変数への変更は既存の接続にもローカル接続にも適用されません。値の変更は新しいセッションにのみ反映されます。

概要

SetVariableStmt
SETVariable=Expression,Variable=Expression
Variable
GLOBALSESSIONSystemVariableUserVariable

sql_modeの値を取得します。

mysql> SHOW GLOBAL VARIABLES LIKE 'sql_mode'; +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+ | Variable_name | Value | +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+ | sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SHOW SESSION VARIABLES LIKE 'sql_mode'; +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+ | Variable_name | Value | +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+ | sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)

sql_modeの値をグローバルに更新します。更新後にSQL_modeの値を確認すると、 SESSIONレベルの値が更新されていないことがわかります。

mysql> SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER'; Query OK, 0 rows affected (0.03 sec) mysql> SHOW GLOBAL VARIABLES LIKE 'sql_mode'; +---------------+-----------------------------------------+ | Variable_name | Value | +---------------+-----------------------------------------+ | sql_mode | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER | +---------------+-----------------------------------------+ 1 row in set (0.00 sec) mysql> SHOW SESSION VARIABLES LIKE 'sql_mode'; +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+ | Variable_name | Value | +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+ | sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)

SET SESSION使用するとすぐに有効になります。

mysql> SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER'; Query OK, 0 rows affected (0.01 sec) mysql> SHOW SESSION VARIABLES LIKE 'sql_mode'; +---------------+-----------------------------------------+ | Variable_name | Value | +---------------+-----------------------------------------+ | sql_mode | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER | +---------------+-----------------------------------------+ 1 row in set (0.00 sec)

ユーザー変数は@で始まります。

SET @myvar := 5; Query OK, 0 rows affected (0.00 sec) SELECT @myvar, @myvar + 1; +--------+------------+ | @myvar | @myvar + 1 | +--------+------------+ | 5 | 6 | +--------+------------+ 1 row in set (0.00 sec)

MySQL 互換性

次の動作の違いが適用されます。

  • SET GLOBALで行われた変更は、クラスター内のすべての TiDB インスタンスに伝播されます。これは、変更がレプリカに伝播されない MySQL とは異なります。
  • TiDB は、いくつかの変数を読み取り可能かつ設定可能なものとして提示します。これは、アプリケーションとコネクタの両方が MySQL 変数を読み取るのが一般的であるため、MySQL との互換性のために必要です。たとえば、JDBC コネクタは、動作に依存していないにもかかわらず、クエリ キャッシュ設定の読み取りと設定の両方を行います。
  • SET GLOBALで行われた変更は、TiDBサーバーの再起動後も保持されます。つまり、TiDB のSET GLOBAL 、MySQL 8.0 以降で利用可能なSET PERSISTに似た動作をすることになります。
  • TiDB はグローバル変数を永続化するため、 SET PERSISTSET PERSIST_ONLYサポートしません。

参照

このページは役に立ちましたか?