MySQL foreign_key_checksはデータベース全体に影響しますか?


201

MySQLでこのコマンドを実行すると:

SET FOREIGN_KEY_CHECKS=0;

エンジン全体に影響しますか、それとも現在のトランザクションのみですか?


15
テスト:mysqlにログイン: '%FOREIGN%'などの変数を表示; SET FOREIGN_KEY_CHECKS = 0; その後、別のコンソールを使用してmysqlにログインします。'%FOREIGN%'などの変数の表示がオフではなくオンになっていることがわかります。
Sean Nguyen

回答:



98

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

次のマニュアルセクションを参照してください
。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

@Aki DBをアップグレードする場合は、他のすべてのユーザーのアクセスをロックするほうがよいと思います。少なくとも書くために。それ以外の場合は、あらゆる種類の同時アクセスの問題が発生する可能性があります。
tishma

1
素晴らしい答えと区別。それがどのように機能するかの結果を理解することが重要です。これは、GLOBAL foreign_key_checksを設定できず、同じセッションで外部キーの制約を無視することを期待することを意味します。非グローバル変数を設定する必要があります。
タイラーコリアー

12

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変数を設定すると、既存の接続のローカル変数は変更されません。ローカル変数も再接続または設定する必要があります。

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

外部キーを完全に一致させたい場合は、チェックをオンにしてキーを追加する必要があります。


1
詳細について教えてください...「外部キーの整合性を完全に保つには、チェックをオンにした状態でキーを追加する必要があります。」
user2782001 2016年

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

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

グローバルを設定しなかった場合、影響を受けるのはセッションのみです。


1

Drupalデータベースを新しいローカルapacheサーバーに移行しようとしたときにも同じエラーが発生しました(WindowsマシンでXAMPPを使用しています)。実際にはこのエラーの意味はわかりませんが、以下の手順を試した後、エラーなしでデータベースをインポートしました。これが役立つことを願っています:

C:\ xampp \ php \ php.iniでphp.iniを変更する

max_execution_time = 600
max_input_time = 600
memory_limit = 1024M
post_max_size = 1024M

C:\ xampp \ mysql \ bin \ my.iniでmy.iniを変更する

max_allowed_packet = 1024M

-2

SET FOREIGN_KEY_CHECKS=0;Mysql クエリブラウザーを使用している場合、バージョン1.1.20では何の影響もありません。ただし、Mysqlクエリブラウザー1.2.17では正常に動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.