2011-12-16 7 views
151

MySQL foreign_key_checksがデータベース全体に影響しますか?</p> <pre><code>SET FOREIGN_KEY_CHECKS=0; </code></pre> <p>それはエンジン全体に影響を与えるか、それは私の現在のトランザクションで行われます。私は、MySQLでこのコマンドを実行する

+13

test:mysqlにログイン: '%FOREIGN%'のような変数を表示; SET FOREIGN_KEY_CHECKS = 0;その後、別のコンソールを使用してmysqlにログインします。私は '%FOREIGN%'のようなショー変数がOFFの代わりにONであることを見ることができます。 –

答えて

92

実際には、2つのforeign_key_checksの変数があります:グローバル変数とローカル(セッションごと)の変数はこれはセッションに設定できることを意味します。接続時に、セッション変数はグローバル変数の値に初期化されます。
コマンドSET foreign_key_checksは、セッション変数を変更します。
グローバル変数を変更するには、SET GLOBAL foreign_key_checksまたはSET @@global.foreign_key_checksを使用します。

には、次のマニュアルの項を参照してください:あなたはGLOBALを設定しなかった場合は
http://dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

+1

各リクエストでforeign_key_checksを設定するのはコストがかかりますか?私はDBをアップグレードするためのスクリプトを持っており、アップグレード中に他の誰かがデフォルトで外部キーチェックを無効にすることはできません。だから私は何百万という質問をして、SETが重要かどうか疑問に思いましたか? – Aki

+0

@Aki DBをアップグレードしているなら、他の人のアクセスをロックするほうが良いと言えます。少なくとも書くために。それ以外の場合は、あらゆる種類の同時アクセスの問題が予想されます。 – tishma

+0

偉大な答えと区別。どのように動作するかの結果を理解することは重要です。これは、GLOBAL 'foreign_key_checks'を設定することができず、同じセッションで外部キー制約を無視することを期待することを意味します。非グローバル変数を設定する必要があります。 –

7
# will get you the current local (session based) state. 
SHOW Variables WHERE Variable_name='foreign_key_checks'; 

を、唯一のあなたのセッションは影響を受けました。

-1

MySQLクエリブラウザを使用している場合、SET FOREIGN_KEY_CHECKS=0;はバージョン1.1.20には影響しません。しかし、MySQLのクエリブラウザ1.2.17でうまく動作します。

9

Ron氏が説明したように、ローカルとグローバルの2つの変数があります。ローカル変数は常に使用され、接続時にはグローバル変数と同じです。

SET FOREIGN_KEY_CHECKS=0; 
SET GLOBAL FOREIGN_KEY_CHECKS=0; 

SHOW Variables WHERE Variable_name='foreign_key_checks'; # always shows local variable 

GLOBAL変数を設定する場合、ローカル変数は既存の接続では変更されません。再接続するか、ローカル変数を設定する必要があります。

FOREIGN_KEY_CHECKSを再度有効にすると、MYSQLは外部キーを強制しません。これにより、外部キーとチェックがオンであっても、一貫性のないデータベースを作成することができます。

外部キーが完全に一貫するようにするには、チェックがオンのときにキーを追加する必要があります。

+1

あなたは詳しく説明できますか? "外部キーが完全に一貫しているようにするには、チェックがオンのときにキーを追加する必要があります。" – user2782001

+3

IDを参照するテーブルがあるとしますが、参照されているレコードがありません。 FOREIGN_KEY_CHECKSがONの間に外部キー(FK)を追加すると、Mysqlはエラーを発生させ、壊れた参照のためにFKの追加を拒否します。 FOREIGN_KEY_CHECKSがオフの間に外部キーを追加すると、mysqlはエラーなしで続行します。後でチェックを有効にしてもエラーは発生しません。 FKがあるにもかかわらず、一貫性のないデータを持つテーブルが作成されました。 このように、FKの存在は、FKチェックがオンの間に追加されない限り、データベースの一貫性を保証しません。 –

関連する問題

 関連する問題