答えて
あなたがあなたの質問にした方法を設定するとセッションベースです。
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
これによれば、FOREIGN_KEY_CHECKS
はスコープの "両方" です。
SET FOREIGN_KEY_CHECKS=0;
またはグローバル:
SET GLOBAL FOREIGN_KEY_CHECKS=0;
実際には、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
各リクエストでforeign_key_checksを設定するのはコストがかかりますか?私はDBをアップグレードするためのスクリプトを持っており、アップグレード中に他の誰かがデフォルトで外部キーチェックを無効にすることはできません。だから私は何百万という質問をして、SETが重要かどうか疑問に思いましたか? – Aki
@Aki DBをアップグレードしているなら、他の人のアクセスをロックするほうが良いと言えます。少なくとも書くために。それ以外の場合は、あらゆる種類の同時アクセスの問題が予想されます。 – tishma
偉大な答えと区別。どのように動作するかの結果を理解することは重要です。これは、GLOBAL 'foreign_key_checks'を設定することができず、同じセッションで外部キー制約を無視することを期待することを意味します。非グローバル変数を設定する必要があります。 –
# will get you the current local (session based) state.
SHOW Variables WHERE Variable_name='foreign_key_checks';
を、唯一のあなたのセッションは影響を受けました。
MySQLクエリブラウザを使用している場合、SET FOREIGN_KEY_CHECKS=0;
はバージョン1.1.20には影響しません。しかし、MySQLのクエリブラウザ1.2.17でうまく動作します。
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は外部キーを強制しません。これにより、外部キーとチェックがオンであっても、一貫性のないデータベースを作成することができます。
外部キーが完全に一貫するようにするには、チェックがオンのときにキーを追加する必要があります。
あなたは詳しく説明できますか? "外部キーが完全に一貫しているようにするには、チェックがオンのときにキーを追加する必要があります。" – user2782001
IDを参照するテーブルがあるとしますが、参照されているレコードがありません。 FOREIGN_KEY_CHECKSがONの間に外部キー(FK)を追加すると、Mysqlはエラーを発生させ、壊れた参照のためにFKの追加を拒否します。 FOREIGN_KEY_CHECKSがオフの間に外部キーを追加すると、mysqlはエラーなしで続行します。後でチェックを有効にしてもエラーは発生しません。 FKがあるにもかかわらず、一貫性のないデータを持つテーブルが作成されました。 このように、FKの存在は、FKチェックがオンの間に追加されない限り、データベースの一貫性を保証しません。 –
test:mysqlにログイン: '%FOREIGN%'のような変数を表示; SET FOREIGN_KEY_CHECKS = 0;その後、別のコンソールを使用してmysqlにログインします。私は '%FOREIGN%'のようなショー変数がOFFの代わりにONであることを見ることができます。 –