SETvariable_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 PASSWORD はアカウント パスワードを割り当てます。詳しくは 項6. 「SET PASSWORD 構文」 を参照してください。
SET TRANSACTION ISOLATION LEVEL はトランザクション プロセスに分離レベルを設定します。詳しくは 項 「SET TRANSACTION 構文」 を参照してください。
SET は、ローカル ルーチン変数に値を割り当てる為のストアド ルーチン内で利用されます。詳しくは 項2. 「変数 SET ステートメント」 を参照してください。
次の説明は、変数を設定する為に利用する事ができる、異なる SET 構文を表しています。例では = 代入演算子を利用していますが、:= 演算子も許容されています。
ユーザ変数は @var_name として書かれ、次のように設定されます。
SET @var_name=expr;
多くのシステム変数は動的であり、SET ステートメントを利用してサーバが起動している間に変更する事ができます。(リストついては、項2. 「動的システム変数」 をご覧ください。)
SET を利用してシステム変数を変更するには、任意で修飾子が先行する var_name として参照してください。
変数がグローバルである事を明示的に指示する為には、その名前に GLOBAL か @@global. を先行させてください。SUPER 権限はグローバル変数を設定する為に要求されます。
変数がセッションである事を明示的に指示する為には、その名前に SESSION か @@global. を先行させてください。セッション変数を設定するのに特別な権限は必要とされませんが、クライアントは自分自身のセッション変数以外は変更できませんので、別のクライアントの物は変更できません。
LOCAL と @@local. は SESSION と @@session. の同義語です。
もし修飾子が何もなければ、SET はセッション変数を変更します。
A SET ステートメントは、カンマで区切られた複数変数割り当てを含む事ができます。もし複数のシステム変数を設定したら、ステートメント内の一番最近の GLOBAL か SESSION 修飾子が、指定された修飾子を持たない次の変数に利用されます。
例:
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 GLOBAL を SET 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 SET と SET NAMES は例外です。)例:
mysql> SELECT @@AUTOCOMMIT;
+--------------+
| @@AUTOCOMMIT |
+--------------+
|            1 |
+--------------+
これらのオプションは、大文字でも小文字でもかまいません。
AUTOCOMMIT = {0 | 1}
オート コミット モードを設定してください。もし1に設定すると、テーブルの全ての変更がすぐに効果を発揮します。もし0に設定すると、トランザクションを受け入れる為には
  COMMIT、キャンセルするには ROLLBACK を利用しなければいけません。デフォルトで、AUTOCOMMIT で始まるクライアント接続は1を設定します。もし AUTOCOMMIT モードを0から1に変更すると、MySQL は開いているトランザクションの自動 COMMIT を実行します。トランザクションを始める別の方法は、START TRANSACTION か BEGIN ステートメントを利用する方法です。詳しくは 項 「START TRANSACTION、COMMIT、そして ROLLBACK 構文」 を参照してください。
BIG_TABLES = {0 | 1}
もし1に設定すると、全てのテンポラリ テーブルは、メモリの中ではなくディスク上に格納されます。これはスピードが少し遅いですが、エラー The table tbl_name is full は、大きいテンポラリ テーブルを必要とする SELECT オペレーションにこれは起こりません。新しい接続のデフォルト値は0です。(メモリ内のテンポラリ テーブルを利用してください。)通常、メモリ内のテーブルは要求に従って自動的にディスク
  ベース テーブルに変換されるので、この変数を設定する必要は全くありません。(注意:この変数は以前は SQL_BIG_TABLES という名前でした。)
CHARACTER SET {charset_name | DEFAULT}
これは与えられたマッピングを利用して全ての文字列をクライアントとの間でマップします。MySQL ソース分布の中で sql/convert.cc を編集する事で新しいマッピングを追加する事ができます。SET CHARACTER SET は3つのセッション システム変数を設定します。character_set_client と character_set_results は与えたれた文字セットに設定され、 character_set_connection は character_set_database の値に設定されます。詳しくは 項9.4. 「接続のキャラクタセットおよび照合順序」 を参照してください。
デフォルトのマッピングは、値 DEFAULT を利用する事で復旧できます。デフォルトはサーバの設定によって決まります。
SET CHARACTER SET の構文は、別のほとんどのオプションを設定している物とは異なる事を覚えておいて下さい。
FOREIGN_KEY_CHECKS = {0 | 1}
もし1に設定すると(デフォルト)、InnoDB テーブルの外部キー制約が確認されます。もし0に設定すると、それらは無視されます。外部キー確認を無効にする事は、それらの親/子供関係に要求される順番とは異なる順番で
  InnoDB を再ロードするのに役立ちます。詳しくは 項4. 「FOREIGN KEY 制約」 を参照してください。
FOREIGN_KEY_CHECKS を0に設定する事もまた、データ定義ステートメントに影響を与えます。DROP SCHEMA は、スキーマ外のテーブルに参照される外部キーを持つテーブルを含んでいてもスキーマをドロップし、そして、DROP TABLE は別のテーブルに参照される外部キーを持つテーブルをドロップします。
Setting FOREIGN_KEY_CHECKS を1に設定する事は、既存テーブル データのスキャンをトリガしません。従って、FOREIGN_KEY_CHECKS=0 の最中にテーブルに追加された行の一貫性の照合はされません。
IDENTITY = value
この変数は LAST_INSERT_ID 変数の同義語です。これは別のデータベース システムとの互換性の為に存在します。この値は SELECT @@IDENTITY を利用して読む事ができ、SET IDENTITY を利用して設定する事ができます。
INSERT_ID = value
AUTO_INCREMENT 値を挿入する時、次の INSERT か ALTER TABLE ステートメントで使用される値を設定してください。これは主にバイナリ ログと共に利用されます。
LAST_INSERT_ID = value
LAST_INSERT_ID() から返される値を設定してください。これは、テーブルを更新するステートメント内で LAST_INSERT_ID() を利用する時にバイナリ ログ内に格納されます。この変数を設定する事で、mysql_insert_id() C API 関数に返される値は更新されません。
NAMES {'charset_name' [COLLATE 'collation_name'} | DEFAULT}
SET NAMES は3つのセッション システム変数 character_set_client、character_set_connection、そして character_set_results を与えられた文字セットに設定します。character_set_connection を charset_name に設定すると、collation_connection も charset_name のデフォルト照合に設定します。任意の COLLATE 条項は照合を明示的に指定するのに利用されるでしょう。詳しくは 項9.4. 「接続のキャラクタセットおよび照合順序」 を参照してください。
デフォルトのマッピングは、値 DEFAULT を利用する事で復旧できます。デフォルトはサーバの設定によって決まります。
SET NAMES の構文は、別のほとんどのオプションを設定している物とは異なる事を覚えておいて下さい。
ONE_SHOT
このオプションは変数ではなく修飾子です。これは、文字セット、照合、そしてタイム ゾーンを設定する変数の効果に影響を与える為に利用する事ができます。ONE_SHOT は主に複製を目的として利用されます。文字セット、照合、そしてタイム ゾーン変数の値をロールフォーワードで元の形を反映させる為に、mysqlbinlog はそれらをテンポラリに修正できるよう SET ONE_SHOT を利用します。ONE_SHOT は内部的な利用の為だけの物で、MySQL 5.0 以降のバージョンでは廃止予定です。
ONE_SHOT を許容された変数のセット以外の物と利用する事はできません。もし利用を試みると、次のようなエラーが発生します。
mysql> SET ONE_SHOT max_allowed_packet = 1;
ERROR 1382 (HY000): The 'SET ONE_SHOT' syntax is reserved for purposes
internal to the MySQL server
  もし ONE_SHOT が許容された変数と共に利用されたら、それは要求されたとおりに変数を変更しますが、それは次の非 SET ステートメントに対してのみ行われます。その後、サーバは全ての文字セット、照合、そしてタイム ゾーンに関連したシステム変数を、以前の値に再設定します。例:
mysql>SET ONE_SHOT character_set_connection = latin5;mysql>SET ONE_SHOT collation_connection = latin5_turkish_ci;mysql>SHOW VARIABLES LIKE '%_connection';+--------------------------+-------------------+ | Variable_name | Value | +--------------------------+-------------------+ | character_set_connection | latin5 | | collation_connection | latin5_turkish_ci | +--------------------------+-------------------+ mysql>SHOW VARIABLES LIKE '%_connection';+--------------------------+-------------------+ | Variable_name | Value | +--------------------------+-------------------+ | character_set_connection | latin1 | | collation_connection | latin1_swedish_ci | +--------------------------+-------------------+
SQL_AUTO_IS_NULL = {0 | 1}
もし1に設定すると(デフォルト)、次の構造を利用する事で AUTO_INCREMENT カラムを含む最後にテーブルに挿入された行を見つける事ができます。
WHERE auto_increment_column IS NULL
  この動作は、Access のようないくつかの ODBC プログラムによって利用されます。
SQL_BIG_SELECTS = {0 | 1}
もし0に設定すると、MySQL は、実行するのにとても時間がかかる SELECT ステートメントを異常終了します。(これはオプチマイザが、分析された行の数が max_join_size の値を超えると判断したステートメントの事です。)これは、得策では無い WHERE ステートメントが発行された時に便利な物です。新しい接続のデフォルト値は、全ての SELECT ステートメントを許容する1です。
もし max_join_size システム変数を DEFAULT 以外の値に設定すると、SQL_BIG_SELECTS は0に設定されます。
SQL_BUFFER_RESULT = {0 | 1}
もし1に設定すると、SQL_BUFFER_RESULT は結果が SELECT ステートメントからテンポラリ テーブルに置かれるように強制します。これは、MySQL がテーブル ロックを早く解除するのを助け、クライアントに結果を送るのに時間がかかる場合に有益な物になります。
  デフォルト値は0です。
SQL_LOG_BIN = {0 | 1}
もし0に設定すると、クライアントの為のバイナリ ログはログされません。クライアントはこのオプションを設定する為に SUPER 権限を持つ必要があります。デフォルト値は1です。
SQL_LOG_OFF = {0 | 1}
もし1に設定すると、このクライアントの為の通常のクエリ ログはログされません。クライアントはこのオプションを設定する為に SUPER 権限を持つ必要があります。デフォルト値は0です。
SQL_LOG_UPDATE = {0 | 1}
この変数は廃止予定であり、SQL_LOG_BIN にマップされています。
SQL_NOTES = {0 | 1}
もし1に設定すると(デフォルト)、Note レベルの警告が記録されます。もし0に設定すると Note 警告は抑制されます。mysqldump はダンプ ファイルの再ロードが、その操作のインテグリティに影響しないイベントに対して警告を発行しないよう、この変数を0に設定する為にアウトプットを含みます。
SQL_QUOTE_SHOW_CREATE = {0 | 1}
もし1に設定すると(デフォルト)、サーバは SHOW CREATE TABLE と SHOW CREATE DATABASE ステートメントに識別子を引用します。もし0に設定すると、引用は無効になります。このオプションは、引用を必要とする識別子に対して複製が機能するように、デフォルトで使用可能となっています。項9. 「SHOW CREATE TABLE 構文」 と 項6. 「SHOW CREATE DATABASE 構文」 を参照して下さい。
SQL_SAFE_UPDATES = {0 | 1}
もし1に設定すると、MySQL は WHERE 条項か LIMIT 条項内でキーを利用しない UPDATE か DELETE ステートメントを異常終了します。これは、キーが正しく利用されずその為に多数の行を変更、または削除する UPDATE か DELETE ステートメントをキャッチする事を可能にします。デフォルト値は0です。
SQL_SELECT_LIMIT = {value | DEFAULT}
SELECT ステートメントから返される最大行数。新しい接続のデフォルト値は 「無制限」 です。もしその制限を変更すると、デフォルト値は DEFAULT の SQL_SELECT_LIMIT 値を利用して復旧できます。
もし SELECT が LIMIT 条項を持っていたら、LIMIT は SQL_SELECT_LIMIT の値を上回ります。
SQL_SELECT_LIMIT は、ストアド ルーチン内で実行された SELECT ステートメントに適応しません。それは、クライアントに戻される結果セットを作成しない SELECT ステートメントには適応しません。これらはサブクエリの中に SELECT ステートメント、CREATE TABLE ... SELECT、そして INSERT INTO ... SELECT を含んでいます。
SQL_WARNINGS = {0 | 1}
この変数は、もし警告が発生したら、単列 INSERT ステートメントが情報を作成するかどうかをコントロールします。デフォルトは0です。情報文字列を作成するには、値を0に設定して下さい。
TIMESTAMP = {timestamp_value | DEFAULT}
このクライアントに時刻を設定してください。これは、もし行の格納にバイナリ ログを利用するなら、元のタイムスタンプを得る為に利用されます。 timestamp_value は MySQL タイムスタンプではなく、ユニックス エポック タイムスタンプでなければいけません。
SET TIMESTAMP は NOW() に返された値に影響しますが、SYSDATE() に返された物には影響しません。これは、バイナリ ログ内のタイムスタンプ設定は SYSDATE() の起動に影響を持たないという意味です。サーバは、SYSDATE() が NOW() のエイリアスになるよう働きかける為に --sysdate-is-now オプションでスタートでき、その場合、SET TIMESTAMP は両方の関数に影響を与えます。
UNIQUE_CHECKS = {0 | 1}
もし1に設定すると(デフォルト)、InnoDB テーブル内の第二インデックスの一意性チェックが行われます。もし0に設定すると、ストレージ エンジンはインプット データ内に複製キーが存在しないと仮定する事を許可されます。もし、ご自分のデータに一意性違反が無い事が確かであれば、これを0に設定して
  InnoDB に大きいテーブルをインポートする際のスピードを早くする事ができます。
この変数を0に設定する事は、ストレージ エンジンが複製キーを無視する事を 要求 する訳ではないと覚えておいて下さい。エンジンは複製キーの確認をし、もしそれらを発見したらエラーを発行する事が許可されています。