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に設定する事は、ストレージ エンジンが複製キーを無視する事を 要求 する訳ではないと覚えておいて下さい。エンジンは複製キーの確認をし、もしそれらを発見したらエラーを発行する事が許可されています。